É mesmo tão impreciso? Eu re-implantei a coisa toda com precisão arbitrária Apfloat e não fez diferença alguma que eu deveria ter sabido começar !!
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); }
A primeira afirmação no teste dá isto:
java.lang.AssertionError: esperado: mas era:
0,29 parece estar muito longe? Essa é a fórmula que escolhi para implementar?
Se você fez o que parece ter feito e feito corretamente, descobriu o rolamento de A de B ao longo da rota mais curta de A para B, que, na superfície da Terra (ish) esférica, é o arco da Terra. grande círculo entre A e B, NÃO o arco da linha de latitude entre A e B.
As funções geodésicas do Mathematica fornecem os rolamentos, para as posições de teste, como 89.7061
e 270.294
.
Então, parece que (a) seu cálculo está correto, mas (b) suas habilidades de navegação precisam ser aprimoradas.
Tem certeza de que isso se deve a problemas numéricos? Devo admitir que não sei exatamente o que você está tentando calcular, mas quando você está lidando com ângulos em uma esfera, pequenos desvios do que você esperaria na geometry euclidiana.
java.lang.AssertionError: esperado: <270.0> mas era: <270.29389750911355>
Este erro absoluto de 0,29 representa um erro relativo de 0,1%. Como isso é “muito longe”?
Floats dará 7 dígitos significativos; duplos são bons para 16. Podem ser as funções trigonométricas ou a conversão de graus para radianos.
Fórmula parece certa, se esta fonte for acreditada.
Se eu ligar os seus valores inicial e final nessa página, o resultado que eles reportam é 089 ° 42′22 ″. Se eu subtrair seu resultado do 360 e converter para graus, minutos e segundos, seu resultado será idêntico ao deles. Ou ambos estão corretos ou ambos estão errados.