]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/data/Altitude.java
Version 7, February 2009
[GpsPrune.git] / tim / prune / data / Altitude.java
1 package tim.prune.data;
2
3 /**
4  * Class to hold an altitude and provide conversion functions
5  */
6 public class Altitude
7 {
8         private boolean _valid = false;
9         private int _value = 0;
10         private Format _format = Format.NO_FORMAT;
11         private String _stringValue = null;
12
13         /** Altitude formats */
14         public enum Format {
15                 /** No format */
16                 NO_FORMAT,
17                 /** Metres */
18                 METRES,
19                 /** Feet */
20                 FEET
21         }
22
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;
26
27         /** Constant for no altitude value */
28         public static final Altitude NONE = new Altitude(null, Format.NO_FORMAT);
29
30
31         /**
32          * Constructor using String
33          * @param inString string to parse
34          * @param inFormat format of altitude, either metres or feet
35          */
36         public Altitude(String inString, Format inFormat)
37         {
38                 if (inString != null && !inString.equals(""))
39                 {
40                         try
41                         {
42                                 _stringValue = inString;
43                                 _value = (int) Double.parseDouble(inString.trim());
44                                 _format = inFormat;
45                                 _valid = true;
46                         }
47                         catch (NumberFormatException nfe) {}
48                 }
49         }
50
51
52         /**
53          * Constructor with int vaue
54          * @param inValue int value of altitude
55          * @param inFormat format of altitude, either metres or feet
56          */
57         public Altitude(int inValue, Format inFormat)
58         {
59                 _value = inValue;
60                 _format = inFormat;
61                 _valid = true;
62         }
63
64
65         /**
66          * @return true if the value could be parsed
67          */
68         public boolean isValid()
69         {
70                 return _valid;
71         }
72
73
74         /**
75          * @return raw value as int
76          */
77         public int getValue()
78         {
79                 return _value;
80         }
81
82
83         /**
84          * @return format of number
85          */
86         public Format getFormat()
87         {
88                 return _format;
89         }
90
91
92         /**
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
96          */
97         public int getValue(Format inFormat)
98         {
99                 // Note possible rounding errors here if converting to/from units
100                 if (inFormat == _format)
101                         return _value;
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);
106                 return _value;
107         }
108
109         /**
110          * Get a string version of the value
111          * @param inFormat specified format
112          * @return string value, if possible the original one
113          */
114         public String getStringValue(Format inFormat)
115         {
116                 if (!_valid) {return "";}
117                 if (inFormat == _format && _stringValue != null && !_stringValue.equals("")) {
118                         return _stringValue;
119                 }
120                 return "" + getValue(inFormat);
121         }
122
123
124         /**
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
131          */
132         public static Altitude interpolate(Altitude inStart, Altitude inEnd, int inIndex, int inNumSteps)
133         {
134                 return interpolate(inStart, inEnd, 1.0 * (inIndex + 1) / (inNumSteps + 1));
135         }
136
137
138         /**
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
144          */
145         public static Altitude interpolate(Altitude inStart, Altitude inEnd, double inFrac)
146         {
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);
157         }
158 }