OSDN Git Service

定数を楕円体モデルごとに整理,Hieghtクラスに対応
[yubeshi/yubeshi.git] / YubeshiTest / EnuCoordinateTest.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 using NUnit.Framework;\r
12 using Yubeshi;\r
13 using C = YubeshiTest.SampleCoordinates;\r
14 \r
15 namespace YubeshiTest\r
16 {\r
17     class EnuCoordinateTest\r
18     {\r
19         private static double metreError = 1e-9; // 1nm\r
20         [Test]\r
21         public void ZeroDistance()\r
22         {\r
23             EnuCoordinate enu = new EnuCoordinate(C.SkytreeTop, C.SkytreeTop);\r
24             Assert.AreEqual(0.0, enu.E);\r
25             Assert.AreEqual(0.0, enu.N);\r
26             Assert.AreEqual(0.0, enu.U);\r
27         }\r
28 \r
29         [Test]\r
30         public void UpOnly()\r
31         {\r
32             EnuCoordinate enu = new EnuCoordinate(\r
33                                                 C.SkytreeTop, C.SkytreeBottom);\r
34 \r
35             Assert.AreEqual(0.0, enu.E, metreError);\r
36             Assert.AreEqual(0.0, enu.N, metreError);\r
37             Assert.AreEqual(634.0, enu.U, metreError);\r
38         }\r
39 \r
40         [Test]\r
41         public void TwoPoints()\r
42         {\r
43             GeodeticCoordinate c1 = C.SkytreeTop;\r
44             GeodeticCoordinate c2 = C.TokyoTowerTop;\r
45             GeodeticCoordinate c0 = new GeodeticCoordinate(\r
46                                         0.5 * (c1.Latitude + c2.Latitude),\r
47                                         0.5 * (c1.Longitude + c2.Longitude),\r
48                                         0.0);\r
49             EnuCoordinate enu1 = new EnuCoordinate(c1, c0);\r
50             EnuCoordinate enu2 = new EnuCoordinate(c2, c0);\r
51             double de = enu1.E - enu2.E;\r
52             double dn = enu1.N - enu2.N;\r
53             double du = enu1.U - enu2.U;\r
54 \r
55             // approximation\r
56             double distance = Math.Sqrt(de * de + dn * dn);\r
57             double direction = Math.Atan2(de, dn) * 180.0 / Math.PI;\r
58             \r
59             Assert.AreEqual(8222.097, distance, 15.0);\r
60 \r
61             // c1->c2 45.926 deg\r
62             // c2->c1 45.965 + 180 deg\r
63             // 45.9455 = 0.5 * (45.926 + 45.965)\r
64             Assert.AreEqual(45.946, direction, 1.0 / 60.0);\r
65             Assert.AreEqual(289.0, du, 1e-3);\r
66         }\r
67 \r
68         [Test]\r
69         public void ToEcefCoordinate()\r
70         {\r
71             EnuCoordinate enu = new EnuCoordinate(\r
72                                             C.SkytreeTop, C.TokyoTowerTop);\r
73             EcefCoordinate ecef1 = enu.ToEcefCoordinate();\r
74             EcefCoordinate ecef2 = C.SkytreeTop.ToEcefCoordinate();\r
75 \r
76             Assert.AreEqual(ecef2.X, ecef1.X, metreError);\r
77             Assert.AreEqual(ecef2.Y, ecef1.Y, metreError);\r
78             Assert.AreEqual(ecef2.Z, ecef1.Z, metreError);\r
79         }\r
80     }\r
81 }\r