]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/data/Altitude.java
Version 4, January 2008
[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 int _format = -1;
11         public static final int FORMAT_NONE   = -1;
12         public static final int FORMAT_METRES = 0;
13         public static final int FORMAT_FEET = 1;
14
15         private static final double CONVERT_FEET_TO_METRES = 0.3048;
16         private static final double CONVERT_METRES_TO_FEET = 3.28084;
17
18
19         /**
20          * Constructor using String
21          * @param inString string to parse
22          * @param inFormat format of altitude, either metres or feet
23          */
24         public Altitude(String inString, int inFormat)
25         {
26                 if (inString != null && !inString.equals(""))
27                 {
28                         try
29                         {
30                                 _value = (int) Double.parseDouble(inString.trim());
31                                 _format = inFormat;
32                                 _valid = true;
33                         }
34                         catch (NumberFormatException nfe) {}
35                 }
36         }
37
38
39         /**
40          * Constructor with int vaue
41          * @param inValue int value of altitude
42          * @param inFormat format of altitude, either metres or feet
43          */
44         public Altitude(int inValue, int inFormat)
45         {
46                 _value = inValue;
47                 _format = inFormat;
48                 _valid = true;
49         }
50
51
52         /**
53          * @return true if the value could be parsed
54          */
55         public boolean isValid()
56         {
57                 return _valid;
58         }
59
60
61         /**
62          * @return raw value as int
63          */
64         public int getValue()
65         {
66                 return _value;
67         }
68
69
70         /**
71          * @return format of number
72          */
73         public int getFormat()
74         {
75                 return _format;
76         }
77
78
79         /**
80          * Get the altitude value in the specified format
81          * @param inFormat desired format, either FORMAT_METRES or FORMAT_FEET
82          * @return value as an int
83          */
84         public int getValue(int inFormat)
85         {
86                 // TODO: Fix rounding errors here converting between units - return double?
87                 if (inFormat == _format)
88                         return _value;
89                 if (inFormat == FORMAT_METRES)
90                         return (int) (_value * CONVERT_FEET_TO_METRES);
91                 if (inFormat == FORMAT_FEET)
92                         return (int) (_value * CONVERT_METRES_TO_FEET);
93                 return _value;
94         }
95
96
97         /**
98          * Interpolate a new Altitude object between the given ones
99          * @param inStart start altitude
100          * @param inEnd end altitude
101          * @param inIndex index of interpolated point
102          * @param inNumSteps number of steps to interpolate
103          * @return Interpolated Altitude object
104          */
105         public static Altitude interpolate(Altitude inStart, Altitude inEnd, int inIndex, int inNumSteps)
106         {
107                 return interpolate(inStart, inEnd, 1.0 * (inIndex + 1) / (inNumSteps + 1));
108         }
109
110
111         /**
112          * Interpolate a new Altitude object between the given ones
113          * @param inStart start altitude
114          * @param inEnd end altitude
115          * @param inFrac fraction of distance from first point
116          * @return Interpolated Altitude object
117          */
118         public static Altitude interpolate(Altitude inStart, Altitude inEnd, double inFrac)
119         {
120                 // Check if altitudes are valid
121                 if (inStart == null || inEnd == null || !inStart.isValid() || !inEnd.isValid())
122                         return new Altitude(null, FORMAT_NONE);
123                 // Use altitude format of first point
124                 int altFormat = inStart.getFormat();
125                 int startValue = inStart.getValue();
126                 int endValue = inEnd.getValue(altFormat);
127                 // interpolate between start and end
128                 int newValue = startValue + (int) ((endValue - startValue) * inFrac);
129                 return new Altitude(newValue, altFormat);
130         }
131 }