X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Fdata%2FPointScaler.java;fp=src%2Ftim%2Fprune%2Fdata%2FPointScaler.java;h=446c0a204758b0b9c940d6462b8f686aad6030ee;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/data/PointScaler.java b/src/tim/prune/data/PointScaler.java new file mode 100644 index 0000000..446c0a2 --- /dev/null +++ b/src/tim/prune/data/PointScaler.java @@ -0,0 +1,174 @@ +package tim.prune.data; + +/** + * Class to manage the scaling of points, used by the ThreeDModel + */ +public class PointScaler +{ + /** Original data */ + private Track _track = null; + /** Secondary data for terrain grid */ + private Track _terrainTrack = null; + // Scaled values for data track + private double[] _xValues = null; + private double[] _yValues = null; + private double[] _altValues = null; + // Scaled values for terrain track, if any + private double[] _terrainxValues = null; + private double[] _terrainyValues = null; + private double[] _terrainAltValues = null; + // Altitude range + private double _altitudeRange = 0.0; + private double _minAltitudeMetres = 0.0; + // Horizontal distance + private double _horizDistanceMetres = 0.0; + + + /** + * Constructor + * @param inTrack Track object + */ + public PointScaler(Track inTrack) + { + _track = inTrack; + } + + /** + * @param inTrack terrain track to add + */ + public void addTerrain(Track inTrack) + { + _terrainTrack = inTrack; + } + + /** + * Scale the points + */ + public void scale() + { + // Work out extents + TrackExtents extents = new TrackExtents(_track); + extents.applySquareBorder(); + _horizDistanceMetres = Math.max(extents.getHorizontalDistanceMetres(), 1.0); + final int numPoints = _track.getNumPoints(); + + // Find altitude range (including terrain) + DoubleRange altRangeMetres = extents.getAltitudeRange(); + if (_terrainTrack != null) { + altRangeMetres.combine(new TrackExtents(_terrainTrack).getAltitudeRange()); + } + _altitudeRange = altRangeMetres.getRange() / _horizDistanceMetres; + _minAltitudeMetres = altRangeMetres.getMinimum(); + + // create new arrays for scaled values + if (_xValues == null || _xValues.length != numPoints) + { + _xValues = new double[numPoints]; + _yValues = new double[numPoints]; + _altValues = new double[numPoints]; + if (_terrainTrack != null) + { + _terrainxValues = new double[_terrainTrack.getNumPoints()]; + _terrainyValues = new double[_terrainTrack.getNumPoints()]; + _terrainAltValues = new double[_terrainTrack.getNumPoints()]; + } + } + + final double midXvalue = extents.getXRange().getMidValue(); + final double midYvalue = extents.getYRange().getMidValue(); + final double xyRange = extents.getXRange().getRange(); + + // Calculate scaled values + for (int p=0; p