c - Programmaufgabe

Von: , Frage gestellt am Mi, 6. Okt 1999

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

1 Antworten zu dieser Frage

  1. Antwort von nach 5 Stunden hilfreich
    Re: Pascal-Lösung

    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.

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!