]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/data/Checker.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / data / Checker.java
diff --git a/src/tim/prune/data/Checker.java b/src/tim/prune/data/Checker.java
new file mode 100644 (file)
index 0000000..9d84fab
--- /dev/null
@@ -0,0 +1,118 @@
+package tim.prune.data;
+
+/**
+ * Class to provide checking functions
+ */
+public abstract class Checker
+{
+
+       /**
+        * Check if a given track is doubled, so that each point is given twice,
+        * once as waypoint and again as track point
+        * @param inTrack track to check
+        * @return true if track is doubled, false otherwise
+        */
+       public static boolean isDoubledTrack(Track inTrack)
+       {
+               // Check for empty track
+               if (inTrack == null || inTrack.getNumPoints() < 2) {return false;}
+               // Check for non-even number of points
+               final int numPoints = inTrack.getNumPoints();
+               if (numPoints % 2 != 0) {return false;}
+               // Loop through first half of track
+               final int halfNum = numPoints / 2;
+               for (int i=0; i<halfNum; i++)
+               {
+                       DataPoint firstPoint = inTrack.getPoint(i);
+                       DataPoint secondPoint = inTrack.getPoint(i + halfNum);
+                       if (!firstPoint.getLatitude().equals(secondPoint.getLatitude())
+                               || !firstPoint.getLongitude().equals(secondPoint.getLongitude())) {
+                               return false;
+                       }
+               }
+               // Passed the test, so contents must all be doubled
+               return true;
+       }
+
+       /**
+        * Find the index of the next segment start after the given index
+        * @param inTrack track object
+        * @param inIndex current index
+        * @return index of next segment start
+        */
+       public static int getNextSegmentStart(Track inTrack, int inIndex)
+       {
+               int i = inIndex + 1;
+               DataPoint point = null;
+               while ((point=inTrack.getPoint(i)) != null && (point.isWaypoint() || !point.getSegmentStart())) {
+                       i++;
+               }
+               return Math.min(i, inTrack.getNumPoints()-1);
+       }
+
+       /**
+        * Find the index of the previous segment start before the given index
+        * @param inTrack track object
+        * @param inIndex current index
+        * @return index of previous segment start
+        */
+       public static int getPreviousSegmentStart(Track inTrack, int inIndex)
+       {
+               int i = inIndex - 1;
+               DataPoint point = null;
+               while ((point=inTrack.getPoint(i)) != null && (point.isWaypoint() || !point.getSegmentStart())) {
+                       i--;
+               }
+               // Have we gone past the beginning of the track?
+               i = Math.max(i, 0);
+               // count forwards past the waypoints if necessary
+               while ((point=inTrack.getPoint(i)) != null && point.isWaypoint()) {
+                       i++;
+               }
+               return i;
+       }
+
+       /**
+        * Find the index of the last track point in the current segment
+        * @param inTrack track object
+        * @param inIndex current index
+        * @return index of next segment end
+        */
+       public static int getNextSegmentEnd(Track inTrack, int inIndex)
+       {
+               // First, go to start of following segment, or the end of the track
+               int i = getNextSegmentStart(inTrack, inIndex);
+               // If it's the next segment, subtract one
+               DataPoint point = inTrack.getPoint(i);
+               if (point == null || point.getSegmentStart())
+               {
+                       i--;
+               }
+               // Now we may be on a waypoint, so count back to get the last track point
+               while ((point=inTrack.getPoint(i)) != null && point.isWaypoint()) {
+                       i--;
+               }
+               return Math.min(i, inTrack.getNumPoints()-1);
+       }
+
+
+       /**
+        * @param inTrack track object
+        * @return true if there is at least one waypoint with a timestamp
+        */
+       public static boolean haveWaypointsGotTimestamps(Track inTrack)
+       {
+               if (inTrack != null)
+               {
+                       for (int i=0; i<inTrack.getNumPoints(); i++)
+                       {
+                               DataPoint p = inTrack.getPoint(i);
+                               if (p != null && p.isWaypoint() && p.hasTimestamp())
+                               {
+                                       return true;
+                               }
+                       }
+               }
+               return false;
+       }
+}