OSDN Git Service

Subframeの実装と非抽象クラス化
[yubeshi/yubeshi.git] / Yubeshi / Degree.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     public struct Degree\r
15     {\r
16         #region fields\r
17         private double degree;\r
18         private static readonly double degToRad = Constants.Pi / 180.0;\r
19         private static readonly double radToDeg = 180.0 / Constants.Pi;\r
20         #endregion\r
21 \r
22         #region constructors\r
23         public Degree(double degree)\r
24         {\r
25             this.degree = degree;\r
26         }\r
27 \r
28         public Degree(int degree, int minute, int second)\r
29         {\r
30             if ((degree >= 0 && minute >= 0 && second >= 0) ||\r
31                 (degree <= 0 && minute <= 0 && second <= 0)) \r
32             {\r
33                 this.degree = (double)degree + minute / 60.0 + second / 3600.0;\r
34             }\r
35             else\r
36             {\r
37                 this.degree =\r
38                        -Math.Abs((double)degree)\r
39                        - Math.Abs(minute / 60.0)\r
40                        - Math.Abs(second / 3600.0);\r
41             }\r
42         }\r
43 \r
44         public Degree(bool negative, uint degree, uint minute, uint second)\r
45         {\r
46             this.degree = (double)degree + minute / 60.0 + second / 3600.0;\r
47             if (negative)\r
48             {\r
49                 this.degree = -degree;\r
50             }\r
51         }\r
52         #endregion\r
53 \r
54         #region operators\r
55         public static implicit operator Degree(double degree)\r
56         {\r
57             return new Degree(degree);\r
58         }\r
59 \r
60         public static implicit operator double(Degree degree)\r
61         {\r
62             return degree.degree;\r
63         }\r
64         #endregion\r
65 \r
66         #region properties\r
67 \r
68         public int Deg\r
69         {\r
70             get\r
71             {\r
72                 return (int)degree;\r
73             }\r
74         }\r
75 \r
76         public int Minute\r
77         {\r
78             get\r
79             {\r
80                 return (int)(degree * 60) % 60;\r
81             }\r
82         }\r
83 \r
84         public int Second\r
85         {\r
86             get\r
87             {\r
88                 return (int)(degree * 3600) % 60;\r
89             }\r
90         }\r
91 \r
92         public double Radian\r
93         {\r
94             get\r
95             {\r
96                 return degree * degToRad;\r
97             }\r
98         }\r
99  \r
100         #endregion\r
101 \r
102         #region public methods\r
103 \r
104         public static Degree FromRadian(double rad)\r
105         {\r
106             return new Degree(rad * radToDeg);\r
107         }\r
108 \r
109         public static Degree FromGpsFormat(string angle)\r
110         {\r
111             return FromNmeaFormat(angle, null);\r
112         }\r
113 \r
114         public static Degree FromNmeaFormat(string angle, string direction)\r
115         {\r
116             decimal raw = Decimal.Parse(angle);\r
117             double deg = (double)(Math.Floor(raw / 100m) + (raw % 100m) / 60m);\r
118             if (direction == "S" || direction == "W")\r
119             {\r
120                 return new Degree(-deg);\r
121             }\r
122             return new Degree(deg);\r
123         }\r
124 \r
125         public override string ToString()\r
126         {\r
127             if (degree < 0)\r
128             {\r
129                 return String.Format("-{0}°{1}′{2}″",\r
130                                                 -Deg, -Minute, -Second);\r
131             }\r
132             else\r
133             {\r
134                 return String.Format("{0}°{1}′{2}″", Deg, Minute, Second);\r
135             }\r
136         }\r
137 \r
138         public string ToString(string format)\r
139         {\r
140             return degree.ToString(format);\r
141         }\r
142         #endregion\r
143     }\r
144 }\r