C - Programmaufgabe

Hallo miteinander,

ich habe folgendes Problem:

Wie und was muss ich programmieren, wenn
ich die minimale Entfernung zweier beliebiger Punkte auf einer idealen
Erdoberflaeche (r=6378km) berechnen kann?
Beispiel:
Frankfurt hat 50Grad 06 min noerdlicher Breite und 08 Grad 40 min oestlicher Laenge
Berlin hat 52 Grad 32 min noerdlicher Br.
und 13 Grad 25 min oestlicher Laenge.
Die Eingabemaske soll die Grad, die
Minuten und die Ausrichtung abfragen.

Fuer Hilfe waere ich sehr dankbar.

MfG

Joerg Moestl

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.