]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/function/compress/DuplicatePointAlgorithm.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / function / compress / DuplicatePointAlgorithm.java
diff --git a/src/tim/prune/function/compress/DuplicatePointAlgorithm.java b/src/tim/prune/function/compress/DuplicatePointAlgorithm.java
new file mode 100644 (file)
index 0000000..ce3f597
--- /dev/null
@@ -0,0 +1,82 @@
+package tim.prune.function.compress;
+
+import java.awt.Component;
+import java.awt.event.ActionListener;
+
+import tim.prune.data.DataPoint;
+import tim.prune.data.Track;
+
+/**
+ * Algorithm for detecting duplicate points to compress
+ */
+public class DuplicatePointAlgorithm extends CompressionAlgorithm
+{
+       /** Number of points before this one to consider as duplicates */
+       private static final int NUM_POINTS_TO_BACKTRACK = 20;
+
+       /**
+        * Constructor
+        * @param inTrack track object
+        * @param inDetails track details object
+        * @param inListener listener to attach to activation control
+        */
+       public DuplicatePointAlgorithm(Track inTrack, TrackDetails inDetails, ActionListener inListener)
+       {
+               super(inTrack, inDetails, inListener);
+       }
+
+       /**
+        * Perform the compression and work out which points should be deleted
+        * @param inFlags deletion flags from previous algorithms
+        * @return number of points deleted
+        */
+       protected int compress(boolean[] inFlags)
+       {
+               int numPoints = _track.getNumPoints();
+               int numDeleted = 0;
+               // Loop over all points looking for duplicates
+               for (int i=1; i<numPoints; i++)
+               {
+                       // Don't delete points which are already marked as deleted
+                       if (!inFlags[i])
+                       {
+                               DataPoint currPoint = _track.getPoint(i);
+                               // Don't delete any photo points or audio points
+                               if (!currPoint.hasMedia())
+                               {
+                                       // loop over last few points before this one
+                                       for (int j=i-NUM_POINTS_TO_BACKTRACK; j<i; j++)
+                                       {
+                                               if (j<0) {j=0;} // only look at last few points, but not before 0
+                                               if (!inFlags[j] && currPoint.isDuplicate(_track.getPoint(j)))
+                                               {
+                                                       inFlags[i] = true;
+                                                       numDeleted++;
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
+               }
+               return numDeleted;
+       }
+
+
+       /**
+        * @return specific gui components for dialog
+        */
+       protected Component getSpecificGuiComponents()
+       {
+               // no parameters to set, so no gui components
+               return null;
+       }
+
+       /**
+        * @return title key for box
+        */
+       protected String getTitleTextKey()
+       {
+               return "dialog.compress.duplicates.title";
+       }
+
+}