OSDN Git Service

基準レベルを指定可能な高さクラスを追加
[yubeshi/yubeshi.git] / Yubeshi / Height.cs
1 /*\r
2  *      Yubeshi GPS Parser\r
3  *\r
4  *      This software is distributed under a zlib-style license.\r
5  *      See license.txt for more information.\r
6  */\r
7 \r
8 using System;\r
9 using System.Collections.Generic;\r
10 using System.Text;\r
11 \r
12 namespace Yubeshi\r
13 {\r
14     /// <summary>\r
15     ///     Height(or Altitude) in metre\r
16     /// </summary>\r
17     public struct Height\r
18     {\r
19         #region type definitions\r
20         public enum Base : int\r
21         {\r
22             Unknown = 0,\r
23             EarthCenter = 1,\r
24             MeanSeaLevel = 2,\r
25             Geoid = 3,\r
26             Ellipsoid = 0x100,\r
27             BesselEllipsoid = Ellipsoid | 41,\r
28             Grs80Ellipsoid = Ellipsoid | 80,\r
29             Wgs84Ellipsoid = Ellipsoid | 84,\r
30         }\r
31         #endregion\r
32 \r
33         #region fields\r
34         private double height;\r
35         private Base baseLevel;\r
36         #endregion\r
37 \r
38         #region constructors\r
39         public Height(double height)\r
40             :this(height, Base.Unknown)\r
41         {\r
42         }\r
43 \r
44         public Height(double height, Base baseLevel)\r
45         {\r
46             \r
47             this.height = height;\r
48             this.baseLevel = baseLevel;\r
49         }\r
50         #endregion\r
51 \r
52         #region operators\r
53         public static implicit operator Height(double height)\r
54         {\r
55             return new Height(height);\r
56         }\r
57 \r
58         public static implicit operator double(Height height)\r
59         {\r
60             return height.height;\r
61         }\r
62         \r
63         public static Height operator +(Height left, double right)\r
64         {\r
65             return new Height(left.height + right, left.baseLevel);\r
66         }\r
67 \r
68         public static Height operator +(double left, Height right)\r
69         {\r
70             return new Height(right.height + left, right.baseLevel);\r
71         }\r
72 \r
73         public static double operator -(Height left, Height right)\r
74         {\r
75             if (left.baseLevel != right.baseLevel)\r
76             {\r
77                 if (left.baseLevel != Base.Unknown &&\r
78                                             right.baseLevel != Base.Unknown)\r
79                 {\r
80                     throw new InvalidOperationException(\r
81                                                     "mismatched base level");\r
82                 }\r
83             }\r
84             return left.height - right.height;\r
85         }\r
86         #endregion\r
87 \r
88         #region properties\r
89 \r
90         public Base BaseLevel\r
91         {\r
92             get\r
93             {\r
94                 return baseLevel;\r
95             }\r
96         }\r
97 \r
98         public bool IsAltitude\r
99         {\r
100             get\r
101             {\r
102                 return (baseLevel == Base.MeanSeaLevel) ||\r
103                                                     (baseLevel == Base.Geoid);\r
104             }\r
105         }\r
106         #endregion\r
107 \r
108         #region public methods\r
109         #endregion\r
110     }\r
111 }\r