X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Ffunction%2Fcompress%2FTrackDetails.java;fp=src%2Ftim%2Fprune%2Ffunction%2Fcompress%2FTrackDetails.java;h=b2188619ef40bcc87675e43fd4148c20003c62f2;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/function/compress/TrackDetails.java b/src/tim/prune/function/compress/TrackDetails.java new file mode 100644 index 0000000..b218861 --- /dev/null +++ b/src/tim/prune/function/compress/TrackDetails.java @@ -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= 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; + } +}