]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/function/compress/TrackDetails.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / function / compress / TrackDetails.java
diff --git a/src/tim/prune/function/compress/TrackDetails.java b/src/tim/prune/function/compress/TrackDetails.java
new file mode 100644 (file)
index 0000000..b218861
--- /dev/null
@@ -0,0 +1,120 @@
+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;
+       }
+}