Почему этот расчет подшипника настолько неточный? - PullRequest
10 голосов
/ 10 февраля 2010

Это даже неточно? Я заново реализовал все это с произвольной точностью Apfloat, и не имело никакого значения, с чего я должен был начать !!

public static double bearing(LatLng latLng1, LatLng latLng2) {
 double deltaLong = toRadians(latLng2.longitude - latLng1.longitude);

 double lat1 = toRadians(latLng1.latitude);
 double lat2 = toRadians(latLng2.latitude);

 double y = sin(deltaLong) * cos(lat2);
 double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(deltaLong);
 double result = toDegrees(atan2(y, x));
 return (result + 360.0) % 360.0;
}

@Test
 public void testBearing() {

  LatLng first = new LatLng(36.0, 174.0);
  LatLng second = new LatLng(36.0, 175.0);
  assertEquals(270.0, LatLng.bearing(second, first), 0.005);
  assertEquals(90.0, LatLng.bearing(first, second), 0.005);
 }

Первое утверждение в тесте дает это:

java.lang.AssertionError: ожидается: <270.0> но было: <+270,29389750911355>

0,29 кажется довольно далеко? Это формула, которую я выбрал для реализации?

Ответы [ 3 ]

16 голосов
/ 10 февраля 2010

Если вы сделали то, что, как вам кажется, сделали и сделали это правильно, вы выяснили направление А от В вдоль кратчайшего пути от А до В, который на поверхности сферической (иш) Земли дуга большого круга между A и B, НЕ дуга линии широты между A и B.

Геодезические функции Mathematica задают для ваших тестовых позиций подшипники как 89.7061 и 270.294.

Итак, (а) ваш расчет верен, но (б) ваши навыки навигации нуждаются в совершенствовании.

1 голос
/ 10 февраля 2010

Вы уверены, что это связано с числовыми проблемами? Я должен признать, что я точно не знаю, что вы пытаетесь вычислить, но когда вы имеете дело с углами на сфере, небольшие отклонения от того, что вы ожидаете в евклидовой геометрии.

1 голос
/ 10 февраля 2010

java.lang.AssertionError: ожидается: <270.0>, но было: <270.29389750911355>

Эта абсолютная ошибка 0,29 представляет относительную ошибку 0,1%. Как это "далеко"?

Число с плавающей запятой даст 7 значащих цифр; удвоения хороши для 16. Это могут быть функции триггера или преобразование градусов в радианы.

Формула выглядит правильно, если этому источнику нужно верить.

Если я добавлю ваши начальные и конечные значения на эту страницу, результат, о котором они сообщат, будет 089 ° 42′22 ″. Если я вычту ваш результат из 360 и преобразую в градусы, минуты и секунды, ваш результат будет таким же, как у них. Либо вы оба правы, либо оба не правы.

...