X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Fthreedee%2FThreeDModel.java;h=abe166c837f88d5c65def6dd947eeedd9b4209f7;hb=326f489e36aa7f235bc19409a57bf4955cd50f24;hp=2c9ac97784e79f24e2c378766283720e354c8a15;hpb=4d5796d02a15808311c09448d79e6e7d1de9d636;p=GpsPrune.git diff --git a/tim/prune/threedee/ThreeDModel.java b/tim/prune/threedee/ThreeDModel.java index 2c9ac97..abe166c 100644 --- a/tim/prune/threedee/ThreeDModel.java +++ b/tim/prune/threedee/ThreeDModel.java @@ -1,6 +1,5 @@ package tim.prune.threedee; -import tim.prune.data.Altitude; import tim.prune.data.DataPoint; import tim.prune.data.PointScaler; import tim.prune.data.Track; @@ -13,15 +12,15 @@ import tim.prune.data.Track; public class ThreeDModel { private Track _track = null; + private Track _terrainTrack = null; private PointScaler _scaler = null; private double _scaleFactor = 1.0; private double _altFactor = 1.0; + private double _externalScaleFactor = 1.0; // MAYBE: How to store rods (lifts) in data? private byte[] _pointTypes = null; private byte[] _pointHeights = null; - private static final double MODEL_SIZE = 10.0; - // Constants for point types public static final byte POINT_TYPE_WAYPOINT = 1; public static final byte POINT_TYPE_NORMAL_POINT = 2; @@ -38,6 +37,14 @@ public class ThreeDModel } + /** + * @param inTrack terrain track to set + */ + public void setTerrain(Track inTrack) + { + _terrainTrack = inTrack; + } + /** * @return the number of points in the model */ @@ -52,9 +59,15 @@ public class ThreeDModel */ public void setAltitudeFactor(double inFactor) { - if (inFactor >= 1.0) { - _altFactor = inFactor; - } + _altFactor = inFactor; + } + + /** + * @param inSize size of model + */ + public void setModelSize(double inSize) + { + _externalScaleFactor = inSize; } /** @@ -64,30 +77,17 @@ public class ThreeDModel { // Use PointScaler to sort out x and y values _scaler = new PointScaler(_track); - _scaler.scale(); - // Calculate scale factor to fit within box - _scaleFactor = 1.0; - if (_scaler.getMaximumHoriz() > 0.0 || _scaler.getMaximumVert() > 0.0) - { - if (_scaler.getMaximumHoriz() > _scaler.getMaximumVert()) - { - // scale limited by longitude - _scaleFactor = MODEL_SIZE / _scaler.getMaximumHoriz(); - } - else - { - // scale limited by latitude - _scaleFactor = MODEL_SIZE / _scaler.getMaximumVert(); - } - } + _scaler.addTerrain(_terrainTrack); + _scaler.scale(); // Add 10% border + // cap altitude scale factor if it's too big - double maxScaledAlt = _scaler.getMaxScaledAlt() * _altFactor; - if (maxScaledAlt > MODEL_SIZE) { + double maxAlt = _scaler.getAltitudeRange() * _altFactor; + if (maxAlt > 0.5) + { // capped - _altFactor = _altFactor * MODEL_SIZE / maxScaledAlt; + // System.out.println("Capped alt factor from " + _altFactor + " to " + (_altFactor * 0.5 / maxAlt)); + _altFactor = _altFactor * 0.5 / maxAlt; } - // calculate lat/long lines - _scaler.calculateLatLongLines(); // calculate point types and height codes calculatePointTypes(); @@ -108,7 +108,7 @@ public class ThreeDModel DataPoint point = _track.getPoint(i); _pointTypes[i] = (point.isWaypoint()?POINT_TYPE_WAYPOINT: (point.getSegmentStart()?POINT_TYPE_SEGMENT_START:POINT_TYPE_NORMAL_POINT)); - _pointHeights[i] = (byte) (point.getAltitude().getValue(Altitude.Format.METRES) / 500); + _pointHeights[i] = (byte) (point.getAltitude().getMetricValue() / 500); } } @@ -120,7 +120,7 @@ public class ThreeDModel */ public double getScaledHorizValue(int inIndex) { - return _scaler.getHorizValue(inIndex) * _scaleFactor; + return _scaler.getHorizValue(inIndex) * _scaleFactor * _externalScaleFactor; } /** @@ -130,7 +130,7 @@ public class ThreeDModel */ public double getScaledVertValue(int inIndex) { - return _scaler.getVertValue(inIndex) * _scaleFactor; + return _scaler.getVertValue(inIndex) * _scaleFactor * _externalScaleFactor; } /** @@ -142,45 +142,46 @@ public class ThreeDModel { // if no altitude, just return 0 double altVal = _scaler.getAltValue(inIndex); - if (altVal < 0) return 0; + if (altVal <= 0.0) return 0.0; // scale according to exaggeration factor - return altVal * _altFactor; + return altVal * _altFactor * _externalScaleFactor; } /** - * @return latitude lines + * Get the scaled horizontal value for the specified terrain point + * @param inIndex index of point + * @return scaled horizontal value */ - public double[] getLatitudeLines() + public double getScaledTerrainHorizValue(int inIndex) { - return _scaler.getLatitudeLines(); + return _scaler.getTerrainHorizValue(inIndex) * _scaleFactor * _externalScaleFactor; } /** - * @param inIndex index of line, starting at 0 - * @return scaled position of latitude line + * Get the scaled vertical value for the specified terrain point + * @param inIndex index of point + * @return scaled vertical value */ - public double getScaledLatitudeLine(int inIndex) + public double getScaledTerrainVertValue(int inIndex) { - return _scaler.getScaledLatitudeLines()[inIndex] * _scaleFactor; + return _scaler.getTerrainVertValue(inIndex) * _scaleFactor * _externalScaleFactor; } /** - * @return longitude lines + * Get the scaled altitude value for the specified terrain point + * @param inIndex index of point + * @return scaled altitude value */ - public double[] getLongitudeLines() + public double getScaledTerrainValue(int inIndex) { - return _scaler.getLongitudeLines(); + // if no altitude, just return 0 + double altVal = _scaler.getTerrainAltValue(inIndex); + if (altVal <= 0.0) return 0.0; + // don't scale by scale factor, needs to be unscaled + return altVal * _altFactor; } - /** - * @param inIndex index of line, starting at 0 - * @return scaled position of longitude line - */ - public double getScaledLongitudeLine(int inIndex) - { - return _scaler.getScaledLongitudeLines()[inIndex] * _scaleFactor; - } /** * @param inIndex index of point, starting at 0 @@ -199,12 +200,4 @@ public class ThreeDModel { return _pointHeights[inIndex]; } - - /** - * @return the current model size - */ - public double getModelSize() - { - return MODEL_SIZE; - } }