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)
{
{
try
{
- _value = Integer.parseInt(inString.trim());
+ _stringValue = inString;
+ _value = (int) Double.parseDouble(inString.trim());
_format = inFormat;
_valid = true;
}
/**
- * 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)
{
*/
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)
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
* @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())
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);
}
}