--- /dev/null
+package tim.prune.function.compress;
+
+import tim.prune.data.DataPoint;
+import tim.prune.data.Track;
+
+/**
+ * Class to hold details about a track
+ * which might be useful for compression
+ */
+public class TrackDetails
+{
+ /** Track object */
+ private Track _track = null;
+ /** Range span */
+ private double _trackSpan = -1.0;
+ /** Markers for start of segment */
+ private boolean[] _segmentStarts = null;
+ /** Markers for end of segment */
+ private boolean[] _segmentEnds = null;
+ /** Mean distance between track points in radians */
+ private double _meanRadians = 0.0;
+
+
+ /**
+ * Constructor
+ * @param inTrack track object
+ */
+ public TrackDetails(Track inTrack)
+ {
+ _track = inTrack;
+ }
+
+ /**
+ * Recalculate all details
+ */
+ public void initialise()
+ {
+ // calculate track span
+ double xRange = _track.getXRange().getRange();
+ double yRange = _track.getYRange().getRange();
+ _trackSpan = (xRange > yRange ? xRange : yRange);
+
+ // Calculate segment starts / ends
+ int numPoints = _track.getNumPoints();
+ _segmentStarts = new boolean[numPoints];
+ _segmentEnds = new boolean[numPoints];
+ int prevTrackPointIndex = -1;
+ int numDistances = 0; double totalRadians = 0.0;
+ // Loop over points
+ for (int i=0; i<numPoints; i++)
+ {
+ DataPoint point = _track.getPoint(i);
+ if (!point.isWaypoint())
+ {
+ // track point, check for segment flag
+ if (point.getSegmentStart())
+ {
+ // set start of segment and end of previous
+ _segmentStarts[i] = true;
+ if (prevTrackPointIndex >= 0) {
+ _segmentEnds[prevTrackPointIndex] = true;
+ }
+ }
+ else {
+ // Add up distances between points within the same track segment
+ if (prevTrackPointIndex >= 0) {
+ numDistances++;
+ totalRadians += DataPoint.calculateRadiansBetween(_track.getPoint(prevTrackPointIndex), point);
+ }
+ }
+ prevTrackPointIndex = i;
+ }
+ }
+ // last segment
+ _segmentEnds[prevTrackPointIndex] = true;
+ // Mean radians between points
+ _meanRadians = totalRadians / numDistances;
+ }
+
+
+ /**
+ * @return the track span
+ */
+ public double getTrackSpan()
+ {
+ if (_trackSpan < 0.0) {initialise();}
+ return _trackSpan;
+ }
+
+ /**
+ * @param inPointIndex index of point to check
+ * @return true if specified point is start of segment
+ */
+ public boolean isSegmentStart(int inPointIndex)
+ {
+ if (_segmentStarts == null ||
+ _segmentStarts.length != _track.getNumPoints()) {initialise();}
+ return _segmentStarts[inPointIndex];
+ }
+
+ /**
+ * @param inPointIndex index of point to check
+ * @return true if specified point is end of segment
+ */
+ public boolean isSegmentEnd(int inPointIndex)
+ {
+ if (_segmentEnds == null ||
+ _segmentEnds.length != _track.getNumPoints()) {initialise();}
+ return _segmentEnds[inPointIndex];
+ }
+
+ /**
+ * @return mean radians between adjacent track points
+ */
+ public double getMeanRadians()
+ {
+ if (_meanRadians == 0.0) {initialise();}
+ return _meanRadians;
+ }
+}