OSDN Git Service

基準レベルを指定可能な高さクラスを追加
[yubeshi/yubeshi.git] / Yubeshi / Height.cs
diff --git a/Yubeshi/Height.cs b/Yubeshi/Height.cs
new file mode 100755 (executable)
index 0000000..0a6745c
--- /dev/null
@@ -0,0 +1,111 @@
+/*\r
+ *     Yubeshi GPS Parser\r
+ *\r
+ *     This software is distributed under a zlib-style license.\r
+ *     See license.txt for more information.\r
+ */\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+\r
+namespace Yubeshi\r
+{\r
+    /// <summary>\r
+    ///     Height(or Altitude) in metre\r
+    /// </summary>\r
+    public struct Height\r
+    {\r
+        #region type definitions\r
+        public enum Base : int\r
+        {\r
+            Unknown = 0,\r
+            EarthCenter = 1,\r
+            MeanSeaLevel = 2,\r
+            Geoid = 3,\r
+            Ellipsoid = 0x100,\r
+            BesselEllipsoid = Ellipsoid | 41,\r
+            Grs80Ellipsoid = Ellipsoid | 80,\r
+            Wgs84Ellipsoid = Ellipsoid | 84,\r
+        }\r
+        #endregion\r
+\r
+        #region fields\r
+        private double height;\r
+        private Base baseLevel;\r
+        #endregion\r
+\r
+        #region constructors\r
+        public Height(double height)\r
+            :this(height, Base.Unknown)\r
+        {\r
+        }\r
+\r
+        public Height(double height, Base baseLevel)\r
+        {\r
+            \r
+            this.height = height;\r
+            this.baseLevel = baseLevel;\r
+        }\r
+        #endregion\r
+\r
+        #region operators\r
+        public static implicit operator Height(double height)\r
+        {\r
+            return new Height(height);\r
+        }\r
+\r
+        public static implicit operator double(Height height)\r
+        {\r
+            return height.height;\r
+        }\r
+        \r
+        public static Height operator +(Height left, double right)\r
+        {\r
+            return new Height(left.height + right, left.baseLevel);\r
+        }\r
+\r
+        public static Height operator +(double left, Height right)\r
+        {\r
+            return new Height(right.height + left, right.baseLevel);\r
+        }\r
+\r
+        public static double operator -(Height left, Height right)\r
+        {\r
+            if (left.baseLevel != right.baseLevel)\r
+            {\r
+                if (left.baseLevel != Base.Unknown &&\r
+                                            right.baseLevel != Base.Unknown)\r
+                {\r
+                    throw new InvalidOperationException(\r
+                                                    "mismatched base level");\r
+                }\r
+            }\r
+            return left.height - right.height;\r
+        }\r
+        #endregion\r
+\r
+        #region properties\r
+\r
+        public Base BaseLevel\r
+        {\r
+            get\r
+            {\r
+                return baseLevel;\r
+            }\r
+        }\r
+\r
+        public bool IsAltitude\r
+        {\r
+            get\r
+            {\r
+                return (baseLevel == Base.MeanSeaLevel) ||\r
+                                                    (baseLevel == Base.Geoid);\r
+            }\r
+        }\r
+        #endregion\r
+\r
+        #region public methods\r
+        #endregion\r
+    }\r
+}\r