1 package tim.prune.data;
4 * Class to hold an altitude and provide conversion functions
8 private boolean _valid = false;
9 private int _value = 0;
10 private Format _format = Format.NO_FORMAT;
11 private String _stringValue = null;
13 /** Altitude formats */
23 /** Constants for conversion */
24 private static final double CONVERT_FEET_TO_METRES = 0.3048;
25 private static final double CONVERT_METRES_TO_FEET = 3.28084;
27 /** Constant for no altitude value */
28 public static final Altitude NONE = new Altitude(null, Format.NO_FORMAT);
32 * Constructor using String
33 * @param inString string to parse
34 * @param inFormat format of altitude, either metres or feet
36 public Altitude(String inString, Format inFormat)
38 if (inString != null && !inString.equals(""))
42 _stringValue = inString;
43 _value = (int) Double.parseDouble(inString.trim());
47 catch (NumberFormatException nfe) {}
53 * Constructor with int vaue
54 * @param inValue int value of altitude
55 * @param inFormat format of altitude, either metres or feet
57 public Altitude(int inValue, Format inFormat)
66 * @return true if the value could be parsed
68 public boolean isValid()
75 * @return raw value as int
84 * @return format of number
86 public Format getFormat()
93 * Get the altitude value in the specified format
94 * @param inFormat desired format, either FORMAT_METRES or FORMAT_FEET
95 * @return value as an int
97 public int getValue(Format inFormat)
99 // Note possible rounding errors here if converting to/from units
100 if (inFormat == _format)
102 if (inFormat == Format.METRES)
103 return (int) (_value * CONVERT_FEET_TO_METRES);
104 if (inFormat == Format.FEET)
105 return (int) (_value * CONVERT_METRES_TO_FEET);
110 * Get a string version of the value
111 * @param inFormat specified format
112 * @return string value, if possible the original one
114 public String getStringValue(Format inFormat)
116 if (!_valid) {return "";}
117 if (inFormat == _format && _stringValue != null && !_stringValue.equals("")) {
120 return "" + getValue(inFormat);
125 * Interpolate a new Altitude object between the given ones
126 * @param inStart start altitude
127 * @param inEnd end altitude
128 * @param inIndex index of interpolated point
129 * @param inNumSteps number of steps to interpolate
130 * @return Interpolated Altitude object
132 public static Altitude interpolate(Altitude inStart, Altitude inEnd, int inIndex, int inNumSteps)
134 return interpolate(inStart, inEnd, 1.0 * (inIndex + 1) / (inNumSteps + 1));
139 * Interpolate a new Altitude object between the given ones
140 * @param inStart start altitude
141 * @param inEnd end altitude
142 * @param inFrac fraction of distance from first point
143 * @return Interpolated Altitude object
145 public static Altitude interpolate(Altitude inStart, Altitude inEnd, double inFrac)
147 // Check if altitudes are valid
148 if (inStart == null || inEnd == null || !inStart.isValid() || !inEnd.isValid())
149 return Altitude.NONE;
150 // Use altitude format of first point
151 Format altFormat = inStart.getFormat();
152 int startValue = inStart.getValue();
153 int endValue = inEnd.getValue(altFormat);
154 // interpolate between start and end
155 int newValue = startValue + (int) ((endValue - startValue) * inFrac);
156 return new Altitude(newValue, altFormat);