]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/data/Altitude.java
Version 6, October 2008
[GpsPrune.git] / tim / prune / data / Altitude.java
index 54a3f68eb862416791840dcfcb84009a5d191499..78a98e04f93fba650517cc79201c8d322c379fa6 100644 (file)
@@ -8,16 +8,25 @@ public class Altitude
        private boolean _valid = false;
        private int _value = 0;
        private int _format = -1;
+       private String _stringValue = null;
+
+       /** Altitude formats */
        public static final int FORMAT_NONE   = -1;
        public static final int FORMAT_METRES = 0;
        public static final int FORMAT_FEET = 1;
 
+       /** Constants for conversion */
        private static final double CONVERT_FEET_TO_METRES = 0.3048;
        private static final double CONVERT_METRES_TO_FEET = 3.28084;
 
+       /** Constant for no altitude value */
+       public static final Altitude NONE = new Altitude(null, FORMAT_NONE);
+
 
        /**
-        * Constructor
+        * Constructor using String
+        * @param inString string to parse
+        * @param inFormat format of altitude, either metres or feet
         */
        public Altitude(String inString, int inFormat)
        {
@@ -25,6 +34,7 @@ public class Altitude
                {
                        try
                        {
+                               _stringValue = inString;
                                _value = (int) Double.parseDouble(inString.trim());
                                _format = inFormat;
                                _valid = true;
@@ -35,7 +45,9 @@ public class Altitude
 
 
        /**
-        * Constructor
+        * Constructor with int vaue
+        * @param inValue int value of altitude
+        * @param inFormat format of altitude, either metres or feet
         */
        public Altitude(int inValue, int inFormat)
        {
@@ -79,7 +91,7 @@ public class Altitude
         */
        public int getValue(int inFormat)
        {
-               // TODO: Fix rounding errors here converting between units - return double?
+               // Note possible rounding errors here if converting to/from units
                if (inFormat == _format)
                        return _value;
                if (inFormat == FORMAT_METRES)
@@ -89,6 +101,19 @@ public class Altitude
                return _value;
        }
 
+       /**
+        * Get a string version of the value
+        * @param inFormat specified format
+        * @return string value, if possible the original one
+        */
+       public String getStringValue(int inFormat)
+       {
+               if (inFormat == _format && _stringValue != null && !_stringValue.equals("")) {
+                       return _stringValue;
+               }
+               return "" + getValue(inFormat);
+       }
+
 
        /**
         * Interpolate a new Altitude object between the given ones
@@ -99,6 +124,19 @@ public class Altitude
         * @return Interpolated Altitude object
         */
        public static Altitude interpolate(Altitude inStart, Altitude inEnd, int inIndex, int inNumSteps)
+       {
+               return interpolate(inStart, inEnd, 1.0 * (inIndex + 1) / (inNumSteps + 1));
+       }
+
+
+       /**
+        * Interpolate a new Altitude object between the given ones
+        * @param inStart start altitude
+        * @param inEnd end altitude
+        * @param inFrac fraction of distance from first point
+        * @return Interpolated Altitude object
+        */
+       public static Altitude interpolate(Altitude inStart, Altitude inEnd, double inFrac)
        {
                // Check if altitudes are valid
                if (inStart == null || inEnd == null || !inStart.isValid() || !inEnd.isValid())
@@ -107,8 +145,8 @@ public class Altitude
                int altFormat = inStart.getFormat();
                int startValue = inStart.getValue();
                int endValue = inEnd.getValue(altFormat);
-               int newValue = startValue
-                       + (int) ((endValue - startValue) * 1.0 / (inNumSteps + 1) * (inIndex + 1));
+               // interpolate between start and end
+               int newValue = startValue + (int) ((endValue - startValue) * inFrac);
                return new Altitude(newValue, altFormat);
        }
 }