Почему этот расчет подшипника настолько неадекватен?

Неужели это даже неточно? Я снова вложил все это в произвольную точность 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 кажется довольно далеко? Является ли это формулой, которую я выбрал для реализации?

Ответ 1

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

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

Итак, это выглядит так: (а) ваш расчет правильный, но (б) ваши навыки навигации требуют полировки.

Ответ 2

java.lang.AssertionError: expected: < 270.0 > но был: < 270.29389750911355 >

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

Поплавки дадут 7 значащих цифр; удвоения хороши для 16. Возможны триггерные функции или градусы для преобразования радианов.

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

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

Ответ 3

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