Por que esse cálculo de rolamentos é tão impreciso?

É 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.

Intereting Posts