Math.sin() ungenau?

Klein0r

Erfahrenes Mitglied
Hallo zusammen.

Ich will gerade eine Funktion schreiben die mir die Entfernung zwischen 2 Punkten auf einer Kugel ausgibt (Orthodrome).

Nun bin ich kein Informatikstudent und nicht unbedingt mit Mathe richtig gut gestellt. Aber ich kann ja wohl eigentlich erwarten das Math.sin(90) auch 1 ergibt. Ich komme aber auf ein Ergebnis von 0.8939966636005579. Das kann ja irgendwie nicht so ganz sein. Mache ich etwas falsch?

Selbst mein Taschenrechner kann das :P

Math.sin(35.7) ergibt auch -0.9096666718335282
und nicht wie normalerweise 0.583541211

Wo ist das Problem? Oder gibt System.out.println() das nur falsch aus
 
Hallo,

ich weiss ja nicht was du für nen Taschenrechner hast, aber meiner gibt bei sin(90) auch das gleiche wie Math.sin() aus... ;)

Aber Scherz beiseite, du hast einfach Gradmaß und Bogenmaß vertauscht, denn im Gradmaß ist sin(90) genau 1, während im Bogenmaß eben das andere Ergebnis rauskommt...
 
Ach ich bin so blöde :)

Math.sin(Math.toRadians(90) ist dann schon mehr 1 ;)

Danke!

Hier meine Funktion zum berechnen der Entfernung zwischen 2 Orten auf der Erde:
Java:
	public static double distanceBetween(double sLaengenGrad, double sBreitenGrad, double dLaengenGrad, double dBreitenGrad) {
		double d = Math.acos(Math.sin(Math.toRadians(sLaengenGrad)) * Math.sin(Math.toRadians(dLaengenGrad)) + Math.cos(Math.toRadians(sLaengenGrad)) * Math.cos(Math.toRadians(dLaengenGrad)) * (Math.cos(Math.toRadians(dBreitenGrad - sBreitenGrad)))) * 6370;
		return Math.round(d);
	}

danke danke ;)
 
Tip noch am Rande: Wenn du eine genauere Berechnung haben möchtest, musst du noch berücksichtigen dass die Erde elliptisch durch die Rotation ist und nicht exakt kugelförmig. Aber wenns ned auf ein paar Kilometerchen ankommt, sollte das passen ;)
 
Tip noch am Rande: Wenn du eine genauere Berechnung haben möchtest, musst du noch berücksichtigen dass die Erde elliptisch durch die Rotation ist und nicht exakt kugelförmig. Aber wenns ned auf ein paar Kilometerchen ankommt, sollte das passen ;)

Meinst so?

Java:
	public static double exactDistanceBetween(double sLaengenGrad, double sBreitenGrad, double dLaengenGrad, double dBreitenGrad) {
		
		double abplattung = 1 / 298.257223563;
		double aequatorradius = 6378.14;
		
		double f, g, l;
		f = (sLaengenGrad + dLaengenGrad) / 2;
		g = (sLaengenGrad - dLaengenGrad) / 2;
		l = (sBreitenGrad - dBreitenGrad) / 2;
		
		double s, c;
		s = Math.pow(Math.sin(Math.toRadians(g)), 2) * Math.pow(Math.cos(Math.toRadians(l)), 2) + Math.pow(Math.cos(Math.toRadians(f)), 2) * Math.pow(Math.sin(Math.toRadians(l)), 2);
		c = Math.pow(Math.cos(Math.toRadians(g)), 2) * Math.pow(Math.cos(Math.toRadians(l)), 2) + Math.pow(Math.sin(Math.toRadians(f)), 2) * Math.pow(Math.sin(Math.toRadians(l)), 2);
		
		double w = Math.atan(Math.sqrt(s/c));
		
		double d = 2 * w * aequatorradius;
		
		double r = Math.sqrt(s*c) / w;
		
		double h1, h2;
		h1 = (3 * r - 1) / (2 * c);
		h2 = (3 * r + 1) / (2 * s);
		
		return d * (1 + abplattung * h1 * Math.pow(Math.sin(Math.toRadians(f)), 2) * Math.pow(Math.cos(Math.toRadians(g)), 2) - abplattung * h2 * Math.pow(Math.cos(Math.toRadians(f)), 2) * Math.pow(Math.sin(Math.toRadians(g)), 2));
	}

hab ich gerade fertig gemacht ;)

Am Beispiel Berlin - Tokio:
Java:
System.out.println(distanceBetween(52.517, 13.40, 35.70, 139.767));
System.out.println(exactDistanceBetween(52.517, 13.40, 35.70, 139.767));

Code:
8917.550141156731 km
8941.193945893248 km

Dafür das es fast einmal um die Welt ist sind es auch nur ~20km... also kann man mit leben ;)

Am beispiel Höxter - Paderborn (Meine Strecke zu Arbeit):
Code:
44.18237314607439 km
44.3271712469583 km
Ein paar Meter ;)

lg
 
Zuletzt bearbeitet:
Gerne - wollte meine Ergebnisse ja keinem vorenthalten ;)
Verbesserungen können gerne gepostet werden...
 
Zurück