return new Degree(rad * radToDeg);\r
}\r
\r
- public static Degree FromGpsFormat(string angle)\r
+ public static Degree FromNmeaFormat(string angle)\r
{\r
return FromNmeaFormat(angle, null);\r
}\r
\r
public override string ToString()\r
{\r
+ double s = Math.Abs(degree * 3600) % 60.0;\r
if (degree < 0)\r
{\r
- return String.Format("-{0}°{1}′{2}″",\r
- -Deg, -Minute, -Second);\r
+ return String.Format("-{0}°{1}′{2:G6}″",\r
+ -Deg, -Minute, s);\r
}\r
else\r
{\r
- return String.Format("{0}°{1}′{2}″", Deg, Minute, Second);\r
+ return String.Format("{0}°{1}′{2:G6}″", Deg, Minute, s);\r
}\r
}\r
\r
{\r
return degree.ToString(format);\r
}\r
+\r
#endregion\r
}\r
}\r
private static class MeridianArcConstants\r
{\r
public static readonly double[] K = new double[]{\r
- 1.0050525018051135299706,\r
- -5.063108622326803921017e-3,\r
- 1.062759032760013166595e-5,\r
- -2.082040715851126522938e-8,\r
- 3.933230470035652928709e-11,\r
- -7.265236169124544217757e-14,\r
- 1.321653368923020906791e-16,\r
- -2.376757353699231655954e-19,\r
- 4.109419740268720338702e-22\r
+ +1.00505250181314665196,\r
+ -5.06310862232687815719e-3,\r
+ +1.06275903276004425316e-5,\r
+ -2.08204071585121779847e-8,\r
+ +3.93323047003588273989e-11,\r
+ -7.26523616912507470164e-14,\r
+ +1.32165336892313669049e-16,\r
+ -2.37675735369947451391e-19,\r
+ +4.10941974026919833771e-22\r
};\r
/*\r
private static long[] GenerateSquaredBinomial(int length)\r
#region fields\r
\r
public static readonly GeodeticCoordinate[] Origins;\r
- private const double e = 0.00669438002290069;\r
- private const double e2 = 6.7394967754788593e-3;\r
+ private const double e = 6.69438002290078733e-3;\r
+ private const double e2 = 6.7394967754789579e-3;\r
private const double m0 = 0.9999;\r
#endregion\r
\r
GeodeticCoordinate origin = Origins[(int)number];\r
double n = GetRadiusOfPrimeVertical(latitude);\r
double cos = Math.Cos(latitude.Radian);\r
- double cos2 = cos * cos;\r
- double c = cos2;\r
\r
double delta = longitude.Radian - origin.Longitude.Radian;\r
- double delta2 = delta * delta;\r
- double d = delta2;\r
\r
double t = Math.Tan(latitude.Radian);\r
double t2 = t * t;\r
double t4 = t2 * t2;\r
\r
- double eta2 = e2 * cos2;\r
+ double eta2 = e2 * cos * cos;\r
double eta4 = eta2 * eta2;\r
- \r
- double deltaS = GetLengthOfMeridianArc(latitude) -\r
- GetLengthOfMeridianArc(origin.Latitude);\r
\r
- X = cos * t * d / 2.0;\r
+ double cd2 = cos * cos * delta * delta;\r
+ double cd = cd2 * t;\r
\r
- d *= delta2;\r
- c *= cos2;\r
- X += c * t * d / 24.0 *\r
- (5.0 - t2 + 9.0 * eta2 + 4.0 * eta4);\r
+ X = cd / 2.0;\r
\r
- d *= delta2;\r
- c *= cos2;\r
- X -= c * t * d / 720.0 *\r
- (-61.0 + 58.0 * t2 -t4 -270.0 * eta2 + 330.0 * t2 * eta2);\r
+ cd *= cd2;\r
+ X += cd / 24.0 * (5.0 - t2 + 9.0 * eta2 + 4.0 * eta4);\r
\r
- d *= delta2;\r
- c *= cos2;\r
- X -= c * t * d / 40320.0 *\r
- (-1385.0 + 3111.0 * t2 - 543.0 * t4 + t4 * t2);\r
+ cd *= cd2;\r
+ X += cd / 720.0 *\r
+ (61.0 - 58.0 * t2 - t4 + 270.0 * eta2 - 330.0 * t2 * eta2);\r
\r
- X *= n;\r
- X = (X + deltaS) * m0;\r
+ cd *= cd2;\r
+ X += cd / 40320.0 *\r
+ (1385.0 - 3111.0 * t2 + 543.0 * t4 - t4 * t2);\r
\r
+ double deltaS = GetLengthOfMeridianArc(latitude) -\r
+ GetLengthOfMeridianArc(origin.Latitude);\r
+ X = (X * n + deltaS) * m0;\r
\r
- c = cos;\r
- d = delta;\r
\r
- Y = c * d;\r
+ cd = cos * delta;\r
+ Y = cd;\r
\r
- d *= delta2;\r
- c *= cos2;\r
- Y -= c * d / 6.0 * (-1.0 + t2 - eta2);\r
+ cd *= cd2;\r
+ Y -= cd / 6.0 * (-1.0 + t2 - eta2);\r
\r
- d *= delta2;\r
- c *= cos2;\r
- Y -= c * d / 120.0 *\r
+ cd *= cd2;\r
+ Y -= cd / 120.0 *\r
(-5.0 + 18.0 * t2 - t4 - 14.0 * eta2 + 58.0 * t2 * eta2);\r
- \r
- d *= delta2;\r
- c *= cos2;\r
- Y -= c * d / 5040.0 *\r
+\r
+ cd *= cd2;\r
+ Y -= cd / 5040.0 *\r
(-61.0 + 479.0 * t2 - 179.0 * t4 + t4 * t2);\r
Y *= n * m0;\r
}\r
{\r
double s = 0;\r
double phi = latitude.Radian;\r
- for (int i = MeridianArcConstants.K.Length -1; i > 0; --i)\r
+ double[] k = MeridianArcConstants.K;\r
+ for (int i = k.Length - 1; i > 0; --i)\r
{\r
- int j = i + i;\r
- s += Math.Sin(j * phi) * MeridianArcConstants.K[i] / j;\r
+ int i2 = i + i;\r
+ s += k[i] * Math.Sin(i2 * phi) / i2;\r
}\r
- s += phi * MeridianArcConstants.K[0];\r
- return s * Constants.SemiMajorAxisA * (1 - e);\r
+ return Constants.SemiMajorAxisA * (1.0 - e) * (s + k[0] * phi);\r
}\r
\r
public static double GetRadiusOfPrimeVertical(Degree latitude)\r
using System.Text;\r
using NUnit.Framework;\r
using Yubeshi;\r
+using C = YubeshiTest.SampleCoordinates;\r
\r
namespace YubeshiTest\r
{\r
class EcefCoordinateTest\r
{\r
+\r
[Test]\r
public void ToGeodeticCoordinate()\r
{\r
- //35.658611, 139.745556\r
- GeodeticCoordinate geo = \r
- new GeodeticCoordinate(35.710058, 139.810719, 634.0);\r
- EcefCoordinate ecef = new EcefCoordinate(-3961181.33065119,\r
- 3346187.6735982029,\r
- 3702487.1956870905);\r
+ GeodeticCoordinate geo = C.SkyTreeTop;\r
+ EcefCoordinate ecef = new EcefCoordinate(-3961181.340,\r
+ 3346187.629,\r
+ 3702487.226);\r
\r
GeodeticCoordinate converted = ecef.ToGeodeticCoordinate();\r
\r
- Assert.AreEqual(geo.Latitude, converted.Latitude, 1e-9);\r
- Assert.AreEqual(geo.Longitude, converted.Longitude, 1e-9);\r
- Assert.AreEqual(geo.Altitude, converted.Altitude, 2e-9);\r
-\r
- \r
+ Assert.AreEqual(geo.Latitude, converted.Latitude, 1e-6);\r
+ Assert.AreEqual(geo.Longitude, converted.Longitude, 1e-6);\r
+ Assert.AreEqual(geo.Altitude, converted.Altitude, 2e-4);\r
\r
}\r
}\r
using System.Collections.Generic;\r
using System.Text;\r
using NUnit.Framework;\r
+using Yubeshi;\r
using Yubeshi.Japan;\r
using C = YubeshiTest.SampleCoordinates;\r
\r
public void LlhToJpc9()\r
{\r
Jpc jpc = new Jpc(C.SkyTreeTop, Jpc.System.IX);\r
- Assert.AreEqual(-32167.406, jpc.X, 0.1);\r
- Assert.AreEqual(-2046.184, jpc.Y, 0.1);\r
+ Assert.AreEqual(-32167.4434696, jpc.X, 1e-3);\r
+ Assert.AreEqual(-2046.2245495, jpc.Y, 1e-3);\r
}\r
\r
[Test]\r
public void GetLengthOfMeridianArc()\r
{\r
Assert.AreEqual(0.0, Jpc.GetLengthOfMeridianArc(0.0));\r
- Assert.AreEqual(10001965.7, Jpc.GetLengthOfMeridianArc(90.0), 0.1);\r
Assert.AreEqual(4984944.4, Jpc.GetLengthOfMeridianArc(45.0), 0.1);\r
+ Assert.AreEqual(10001965.7, Jpc.GetLengthOfMeridianArc(90.0), 0.1);\r
}\r
\r
}\r