2010-02-09 15 views
10

Ist es überhaupt so ungenau? Ich habe die ganze Sache mit Apfloat willkürlich präzisiert und es machte keinen Unterschied, mit welchem ​​ich hätte anfangen sollen !!Warum ist diese Berechnung so falsch?

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); 
} 

Die erste Behauptung im Test ergibt dies:

java.lang.AssertionError: expected:<270.0> but was:<270.29389750911355>

0,29 off ziemlich langen Weg scheint? Ist das die Formel, die ich gewählt habe?

+0

Verwenden Sie arbitrary-precision trig? –

+0

können Sie toRadians und toDegrees hinzufügen? – Ron

+0

Verwenden Sie die trigon Funktion java.lang.Math und importieren Sie static java.lang.Math.toDegrees; Import statisch java.lang.Math.toRadians; – Greg

Antwort

16

Wenn Sie getan haben, was Sie getan haben und es richtig gemacht haben, haben Sie die Peilung von A von B entlang der kürzesten Route von A nach B herausgefunden, die auf der Oberfläche der kugelförmigen (ish) Erde ist der Bogen des Großkreises zwischen A und B, NICHT der Bogen der Breite zwischen A und B.

Die geodätischen Funktionen von Mathematica geben die Positionen für Ihre Testpositionen wie 89.7061 und 270.294 an.

Es sieht also so aus, als ob (a) Ihre Berechnung korrekt ist, aber (b) Ihre Navigationsfähigkeiten aufpoliert werden müssen.

+0

Ganz richtig. Ändern Sie die Testparameter in 0,0 Grad Breite, und der Test wird bestanden. –

+0

Sie haben Recht (b) lassen Sie mich ein Beispiel geben, um mein Verständnis zu zementieren. Wenn ich von Paris (48, -2) nach München (48, -11) laufen wollte, würde ich nicht nach Osten gehen, sondern bei 86,652 Grad. Dies macht mehr Sinn, wenn Sie darüber nachdenken, von irgendwo von Großbritannien nach Grönland zu gehen, würden Sie nicht einer Linie parallel zu einer Breitenlinie folgen (sind Breitengrade parallel ??). – Greg

+2

Nun, Sie würden entlang dieses Lagers gehen (vergessen Sie Straßen und Hindernisse), aber Sie müssten dann ständig Ihre Haltung anpassen, während Sie gingen; Großkreisrouten folgen (allgemein) nicht einer Linie konstanter Peilung (oder Loxodrome). Aber die Dinge werden kompliziert, brechen Bowditch aus. –

1

java.lang.AssertionError: expected:<270.0> but was:<270.29389750911355>

Dieser absolute Fehler von 0,29 stellt einen relativen Fehler von 0,1% dar. Wie ist das "weit weg"?

Schwimmer geben 7 signifikante Ziffern; Doubles sind gut für 16. Könnte die trigonometrischen Funktionen oder die Umwandlung von Grad zu Radiant sein.

Formel sieht richtig aus, wenn this source zu glauben ist.

Wenn ich Ihre Start- und Endwerte auf dieser Seite anschließe, ist das Ergebnis, das sie melden, 089 ° 42'22 ". Wenn ich Ihr Ergebnis von 360 subtrahiere und in Grad, Minuten und Sekunden umwandle, ist Ihr Ergebnis identisch mit dem Ergebnis. Entweder hast du Recht, oder du liegst falsch.

+2

Wenn dies auf einen numerischen Fehler zurückzuführen ist, ist es für eine solch einfache Berechnung ein langer Weg. –

1

Sind Sie sicher, dass dies auf numerische Probleme zurückzuführen ist? Ich muss zugeben, dass ich nicht genau weiß, was Sie zu berechnen versuchen, aber wenn Sie sich mit Winkeln auf einer Kugel beschäftigen, kleine Abweichungen von dem, was Sie in euklidischer Geometrie erwarten würden.

+2

Und manchmal auch große Abweichungen. –

Verwandte Themen