X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Ffunction%2Fcompress%2FSingletonAlgorithm.java;fp=tim%2Fprune%2Ffunction%2Fcompress%2FSingletonAlgorithm.java;h=7a61d1c74fe00249c157369da87b7633887cfa03;hb=54b9d8bc8f0025ccf97a67d9dd217ef1f9cf082f;hp=0000000000000000000000000000000000000000;hpb=52bf9e8686c916be37a26a0b75340393d4478b05;p=GpsPrune.git diff --git a/tim/prune/function/compress/SingletonAlgorithm.java b/tim/prune/function/compress/SingletonAlgorithm.java new file mode 100644 index 0000000..7a61d1c --- /dev/null +++ b/tim/prune/function/compress/SingletonAlgorithm.java @@ -0,0 +1,86 @@ +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 singleton points to compress + */ +public class SingletonAlgorithm extends SingleParameterAlgorithm +{ + /** + * Constructor + * @param inTrack track object + * @param inDetails track details object + * @param inListener listener to attach to activation control + */ + public SingletonAlgorithm(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) + { + double param = getParameter(); + if (param <= 0.0) return 0; + // System.out.println("Singleton algorithm compressing : " + param + ", " + _trackDetails.getMeanRadians()); + int numPoints = _track.getNumPoints(); + int numDeleted = 0; + double threshold = param * _trackDetails.getMeanRadians(); + DataPoint currPoint = null, prevPoint = null; + // Loop over all points looking for points far away from neighbours + for (int i=0; i threshold) + { + // Now need to find next track point, and measure distances + DataPoint nextPoint = _track.getNextTrackPoint(i+1); + if (nextPoint != null && DataPoint.calculateRadiansBetween(currPoint, nextPoint) > threshold) + { + // Found a point to delete (hope that next point hasn't been deleted already) + inFlags[i] = true; + numDeleted++; + } + } + } + // Remember last (not-deleted) track point + if (!currPoint.isWaypoint()) {prevPoint = currPoint;} + } + } + return numDeleted; + } + + /** + * @return specific gui components for dialog + */ + protected Component getSpecificGuiComponents() + { + return getSpecificGuiComponents("dialog.compress.singletons.paramdesc", "2"); + } + + /** + * @return title key for box + */ + protected String getTitleTextKey() + { + return "dialog.compress.singletons.title"; + } +}