/*- ******************************************************************************* * Copyright (c) 2011, 2014 Diamond Light Source Ltd. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Peter Chang - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.dawnsci.analysis.dataset.roi; import java.io.Serializable; import org.eclipse.dawnsci.analysis.api.roi.IROI; /** * Base class for general region of interest */ public class ROIBase implements IROI, Serializable { protected String name; protected double spt[]; // start or centre coordinates protected boolean plot; protected transient RectangularROI bounds; public ROIBase() { spt = new double[2]; } protected void setDirty() { bounds = null; } @Override public String getName() { return name; } @Override public void setName(String name) { this.name = name; } @Override public void setPoint(double[] point) { spt = point; setDirty(); } @Override public void setPoint(int[] point) { setPoint(point[0], point[1]); } @Override public void setPoint(int x, int y) { spt[0] = x; spt[1] = y; setDirty(); } @Override public void setPoint(double x, double y) { spt[0] = x; spt[1] = y; setDirty(); } @Override public double[] getPointRef() { return spt; } @Override public double[] getPoint() { return spt.clone(); } @Override public double getPointX() { return spt[0]; } @Override public double getPointY() { return spt[1]; } @Override public int[] getIntPoint() { return new int[] { (int) spt[0], (int) spt[1] }; } @Override public void addPoint(int[] pt) { spt[0] += pt[0]; spt[1] += pt[1]; setDirty(); } @Override public void addPoint(double[] pt) { spt[0] += pt[0]; spt[1] += pt[1]; setDirty(); } @Override public void addPoint(double x, double y) { spt[0] += x; spt[1] += y; setDirty(); } @Override public ROIBase copy() { ROIBase c = new ROIBase(); c.name = name; c.spt = spt.clone(); c.plot = plot; return c; } @Override public void downsample(double subFactor) { spt[0] /= subFactor; spt[1] /= subFactor; setDirty(); } @Override public void setPlot(boolean require) { plot = require; } @Override public boolean isPlot() { return plot; } @Override public RectangularROI getBounds() { if (bounds == null) bounds = new RectangularROI(spt[0], spt[1], 0, 0, 0); return bounds; } @Override public boolean containsPoint(double x, double y) { return getBounds().containsPoint(x, y); } public boolean containsPoint(double[] pt) { return containsPoint(pt[0], pt[1]); } @Override public boolean isNearOutline(double x, double y, double distance) { RectangularROI b = getBounds().copy(); b.addPoint(-distance, -distance); b.addToLengths(2*distance, 2*distance); return b.containsPoint(x, y); } public boolean isNearOutline(double[] pt, double distance) { return isNearOutline(pt[0], pt[1], distance); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ROIBase that = (ROIBase) obj; if (spt == null || that.spt == null) return false; if (spt.length != that.spt.length) return false; for (int i = spt.length-1; i>=0; i--) { if (Double.doubleToLongBits(spt[i]) != Double.doubleToLongBits(that.spt[i])) return false; } return true; } @Override public int hashCode() { if (spt == null || spt.length == 0) return 0; int h = 0; for (int i = spt.length-1; i>=0; i--) { long l = Double.doubleToLongBits(spt[i]) + 31; h = (int) (h*17L + l); } return h; } @Override public String toString() { return name == null ? "" : String.format("name=%s, ", name); } /** * @param y ordinate of line * @return true if given horizontal line intersects ROI */ protected boolean intersectHorizontal(double y) { RectangularROI r = getBounds(); y -= r.spt[1]; return y >= 0 && y <= r.len[1]; } @Override public double[] findHorizontalIntersections(double y) { return null; } }