package tim.prune.function.sew; import tim.prune.data.Coordinate; import tim.prune.data.DataPoint; /** * Class to represent a possible split point, including * the distances to the previous and next points */ public class SplitPoint implements Comparable { private SplitPoint _nextPoint = null; private Coordinate _longitude = null; private Coordinate _latitude = null; private int _pointIndex = 0; private double _distToPrevPoint = 0.0; private double _distToNextPoint = -1.0; /** * Constructor * @param inPoint data point * @param inIndex point index within track */ public SplitPoint(DataPoint inPoint, int inIndex) { _longitude = inPoint.getLongitude(); _latitude = inPoint.getLatitude(); _pointIndex = inIndex; } /** * @param inDist distance to previous track point */ public void setDistanceToPrevPoint(double inDist) { _distToPrevPoint = inDist; } /** @return distance to previous track point */ public double getDistanceToPrevPoint() { return _distToPrevPoint; } /** * @param inDist distance to next track point, or -1.0 */ public void setDistanceToNextPoint(double inDist) { _distToNextPoint = inDist; } /** @return distance to next track point */ public double getDistanceToNextPoint() { return _distToNextPoint; } /** @return true if this is closer to the next point than to the previous one */ public boolean closerToNext() { return _distToNextPoint > 0.0 && _distToNextPoint < _distToPrevPoint; } /** @return point index */ public int getPointIndex() { return _pointIndex; } /** * @param inOther the next point */ public void setNextPoint(SplitPoint inOther) { _nextPoint = inOther; } /** @return the next point, or null */ public SplitPoint getNextPoint() { return _nextPoint; } /** * @param inOther other segment end * @return true if the coordinates are identical */ public boolean atSamePointAs(SplitPoint inOther) { return inOther != null && _latitude.equals(inOther._latitude) && _longitude.equals(inOther._longitude); } /** * Compare two objects for sorting */ public int compareTo(SplitPoint o) { if (o == null) return -1; // First, sort by latitude if (!_latitude.equals(o._latitude)) { return (_latitude.getDouble() < o._latitude.getDouble() ? -1 : 1); } // Latitudes same, so sort by longitude if (!_longitude.equals(o._longitude)) { return (_longitude.getDouble() < o._longitude.getDouble() ? -1 : 1); } // Points are identical so just sort by index return _pointIndex - o._pointIndex; } }