*/
public class PointScaler
{
- // Original data
+ /** Original data */
private Track _track = null;
- // Scaled values
+ /** 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;
/**
_track = inTrack;
}
+ /**
+ * @param inTrack terrain track to add
+ */
+ public void addTerrain(Track inTrack)
+ {
+ _terrainTrack = inTrack;
+ }
/**
* Scale the points
// Work out extents
TrackExtents extents = new TrackExtents(_track);
extents.applySquareBorder();
- final double horizDistance = Math.max(extents.getHorizontalDistanceMetres(), 1.0);
+ _horizDistanceMetres = Math.max(extents.getHorizontalDistanceMetres(), 1.0);
final int numPoints = _track.getNumPoints();
- // Find altitude range
- _altitudeRange = extents.getAltitudeRange().getRange() / horizDistance;
- final double minAltitude = extents.getAltitudeRange().getMinimum();
+ // 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();
{
_xValues[p] = (_track.getX(p) - midXvalue) / xyRange;
_yValues[p] = (midYvalue - _track.getY(p)) / xyRange; // y values have to be inverted
- _altValues[p] = (point.getAltitude().getMetricValue() - minAltitude) / horizDistance;
+ _altValues[p] = (point.getAltitude().getMetricValue() - _minAltitudeMetres) / _horizDistanceMetres;
+ }
+ }
+ if (_terrainTrack != null)
+ {
+ for (int p=0; p<_terrainTrack.getNumPoints(); p++)
+ {
+ _terrainxValues[p] = (_terrainTrack.getX(p) - midXvalue) / xyRange;
+ _terrainyValues[p] = (midYvalue - _terrainTrack.getY(p)) / xyRange; // y values have to be inverted
+ _terrainAltValues[p] = (_terrainTrack.getPoint(p).getAltitude().getMetricValue() - _minAltitudeMetres) / _horizDistanceMetres;
}
}
}
}
/**
- * @return altitude range, in metres
+ * @return altitude range as fraction of horizontal range
*/
public double getAltitudeRange()
{
return _altitudeRange;
}
+
+ /**
+ * Get the horizontal value for the specified point
+ * @param inIndex index of point, starting at 0
+ * @return scaled horizontal value
+ */
+ public double getTerrainHorizValue(int inIndex)
+ {
+ return _terrainxValues[inIndex];
+ }
+
+ /**
+ * Get the vertical value for the specified point
+ * @param inIndex index of point, starting at 0
+ * @return scaled vertical value
+ */
+ public double getTerrainVertValue(int inIndex)
+ {
+ return _terrainyValues[inIndex];
+ }
+
+ /**
+ * @param inIndex index of point in terrain track
+ * @return scaled altitude value for the specified terrain point
+ */
+ public double getTerrainAltValue(int inIndex)
+ {
+ if (_terrainAltValues != null) {
+ return _terrainAltValues[inIndex];
+ }
+ return 0.0;
+ }
}