Hallo Jörg!
Deine Aufgabe ist recht einfach lösbar.
Betrachten wir eine „Einheitskugel“, also eine Kugel mit dem Radius 1. Die Entfernungszahl zweier Orte auf deren Oberfläche ist identisch mit dem Winkel, den die Ortsvektoren der Orte einschließen (diese Vektoren zeigen vom Kugelmittelpunkt zum jeweiligen Ort), und der Kosinus dieses Winkels ist gleich dem Skalarprodukt der beiden Ortsvektoren.
Das Skalarprodukt kannst Du sofort ausrechnen, wenn Du die kartesischen Koordinaten x1, y1, z1 des Ortes 1 und die kartesischen Koordinaten x2, y2, z2 des Ortes 2 kennst. Dann ist das Skalarprodukt gleich
x1*x2 + y1*y2 + z1*z2.
Du mußt Dir also nur noch überlegen, wie Du aus den sphärischen Koordinaten (darum handelt es sich mathematisch gesehen bei der Längen- und Breitenangabe) die kartesischen bestimmst. Dafür brauchst Du aber nur folgende Umrechnungsformeln zu bemühen:
x = cos(Länge) * cos(Breite)
y = sin(Länge) * cos(Breite)
z = sin(Breite)
Damit ist die Vorgehensweise klar: Zuerst werden aus den Längen- und Breitenangaben die kartesischen Koordinaten der Orte berechnet, um mit deren Hilfe das Skalarprodukt bilden zu können. Auf den Wert des Skalarprodukts wird schließlich die Arcuscosinus-Funktion angewendet. Und zu allerletzt wird das Ergebnis noch mit dem Erdradius multipliziert.
Die Arcuscosinus-Funktion kann vermittels
arccos(x) = pi/2 - arctan(x/sqrt(1-x^2))
auf die Arcustangens-Funktion zurückgeführt werden.
In folgendem Pascal-Listing wird die Entfernung zweier Orte auf diese Weise bestimmt. Sieh Dir mal den Code an. Ich denke, es ist leicht zu erkennen, was wo passiert. Wenn Dir etwas unklar ist, dann poste einfach ins Wer-Weiß-Was, damit ich Dir weiterhelfen kann.
Gruß
Martin
=======================================
PROGRAM OrteDistanz;
TYPE
TNordSued = (nord, sued);
TOstWest = (ost, west);
TOrtekoord
= OBJECT
LaengeGrad: REAL;
LaengeMin : REAL;
OstWest : TOstWest;
BreiteGrad: REAL;
BreiteMin : REAL;
NordSued : TNordSued;
PRIVATE
x, y, z : REAL;
PROCEDURE CalcXYZ;
END;
VAR Ort1, Ort2: TOrteKoord;
PROCEDURE TOrteKoord.CalcXYZ;
CONST k = 0.01745329; (* pi/180 *)
VAR l, b: REAL;
begin
l := k*(LaengeGrad+0.016666667*LaengeMin);
IF OstWest=ost THEN l := -l;
b := k*(BreiteGrad+0.016666667*BreiteMin);
IF NordSued=sued THEN b := -b;
x := cos(l)*cos(b);
y := sin(l)*cos(b);
z := sin(b)
end;
FUNCTION Distance (Ort1, Ort2: TOrteKoord): REAL;
CONST pihalbe = 1.57079633; (* pi/2 *)
RErde = 6378; (* Erdradius in km *)
VAR f: REAL;
begin
(* f := Skalarprodukt der Ortsvektoren der Orte *)
f := Ort1.x*Ort2.x+Ort1.y*Ort2.y+Ort1.z*Ort2.z;
IF f>=1.0 THEN
begin
Distance := 0.0
end
ELSE
begin
(* Alles hinter „*“ dient zur arccos-Berechnung *)
Distance := RErde*(pihalbe-arctan(f/(sqrt(1-f*f))))
end
end;
begin
WITH Ort1 DO
begin
LaengeGrad := 0.0;
LaengeMin := 0.0;
OstWest := ost;
BreiteGrad := 45.0;
BreiteMin := 0.0;
NordSued := nord;
CalcXYZ
end;
WITH Ort2 DO
begin
LaengeGrad := 0.0;
LaengeMin := 0.0;
OstWest := ost;
BreiteGrad := 45.0;
BreiteMin := 0.0;
NordSued := sued;
CalcXYZ
end;
WriteLn(Distance(Ort1,Ort2):1:3)
end.