1 package tim.prune.function.compress;
3 import java.awt.Component;
4 import java.awt.event.ActionListener;
6 import tim.prune.data.DataPoint;
7 import tim.prune.data.Track;
10 * Algorithm for detecting close points to compress
11 * Only checks distance to previous point, not any earlier point
13 public class ClosePointsAlgorithm extends SingleParameterAlgorithm
18 * @param inTrack track object
19 * @param inDetails track details object
20 * @param inListener listener to attach to activation control
22 public ClosePointsAlgorithm(Track inTrack, TrackDetails inDetails, ActionListener inListener)
24 super(inTrack, inDetails, inListener);
28 * Perform the compression and work out which points should be deleted
29 * @param inFlags deletion flags from previous algorithms
30 * @return number of points deleted
32 protected int compress(boolean[] inFlags)
35 double param = getParameter();
36 // Use 1/x if x greater than 1
37 if (param > 1.0) param = 1.0 / param;
38 if (param <= 0.0 || param >= 1.0) {
39 // Parameter isn't valid, don't delete any
42 double threshold = _trackDetails.getTrackSpan() * param;
44 // Loop over all points checking distances to previous point
45 // TODO: Maybe this should also check distance to _next_ point as well!
46 int numPoints = _track.getNumPoints();
47 int prevPointIndex = 0;
48 int prevTrackPointIndex = 0;
49 double pointDist = 0.0;
51 for (int i=1; i<numPoints; i++)
53 // don't delete points already deleted
56 DataPoint currPoint = _track.getPoint(i);
57 // Don't consider waypoints
58 if (!currPoint.isWaypoint())
60 // Don't delete any photo points or start/end of segments
61 if (!currPoint.hasMedia()
62 && !_trackDetails.isSegmentStart(i) && !_trackDetails.isSegmentEnd(i))
64 // Check current point against prevPoint
65 pointDist = Math.abs(_track.getX(i) - _track.getX(prevPointIndex))
66 + Math.abs(_track.getY(i) - _track.getY(prevPointIndex));
67 if (pointDist < threshold) {
71 else if (prevTrackPointIndex != prevPointIndex)
73 // Check current point against prevTrackPoint
74 pointDist = Math.abs(_track.getX(i) - _track.getX(prevTrackPointIndex))
75 + Math.abs(_track.getY(i) - _track.getY(prevTrackPointIndex));
76 if (pointDist < threshold) {
82 if (!inFlags[i]) {prevTrackPointIndex = i;}
84 if (!inFlags[i]) {prevPointIndex = i;}
92 * @return specific gui components for dialog
94 protected Component getSpecificGuiComponents()
96 return getSpecificGuiComponents("dialog.compress.closepoints.paramdesc", "200");
100 * @return title key for box
102 protected String getTitleTextKey()
104 return "dialog.compress.closepoints.title";