====== std.geo.sphere — Entfernungen und Kurse auf der Erdkugel ====== ''import std.geo.sphere;'' Großkreisrechnung mit ''f64''-Grad: Entfernung, Kurs, Zielpunkt, Quer- und Längsabweichung, Loxodrome, Sichtweite. Ergänzt [[lyx_-_programmiersprache:units:geo|std.geo]], das in Mikrograd und ganzzahlig rechnet — hier stehen Gleitkommagrad und die Aufgaben der Navigation. Winkel durchgehend in **Grad**, Entfernungen in **Metern**, Kurse ''0…360'' von Nord im Uhrzeigersinn. → [[lyx_-_programmiersprache:units:geodesy|std.geodesy]] (Ellipsoid statt Kugel) · [[lyx_-_programmiersprache:units:geo|std.geo]] · [[lyx_-_programmiersprache:units:astro:guidance|std.astro.guidance]] · [[lyx_-_programmiersprache:units:mathematik|Mathematik-Units]] · [[lyx_-_programmiersprache:guides:navigation|Guide: Navigation und Wegpunkte]] **Die Unit trägt seit 2026-09-06 englische Namen.** 34 Funktionen und vier Konstanten wurden umbenannt, dazu die Parameternamen. Beide bestehenden Testläufe bleiben grün (62 und 23 Prüfungen). ^ vorher ^ jetzt ^ | ''GeoEntfernung'' · ''GeoEntfernungKm'' · ''GeoEntfernungSm'' | ''GeoDistance'' · ''GeoDistanceKm'' · **''GeoDistanceNm''** | | ''GeoKurs'' · ''GeoEndkurs'' · ''GeoNormKurs'' | ''GeoBearing'' · ''GeoFinalBearing'' · ''GeoNormBearing'' | | ''GeoQuerabweichung'' · ''GeoLaengsabweichung'' | ''GeoCrossTrack'' · ''GeoAlongTrack'' | | ''GeoZielpunkt'' · ''GeoMittelpunkt'' | ''GeoDestination'' · ''GeoMidpoint'' | | ''GeoLoxodromKurs'' · ''GeoLoxodromStrecke'' | ''GeoRhumbBearing'' · ''GeoRhumbDistance'' | | ''GeoAusGMS'' · ''GeoKompassSektor'' | ''GeoFromDms'' · ''GeoCompassSector'' | | ''GeoHorizont'' · ''GeoSichtverbindung'' | ''GeoHorizon'' · ''GeoLineOfSight'' | | ''GEO_NORD'' · ''GEO_SUED'' · ''GEO_OST'' · ''GEO_WEST'' | ''GEO_NORTH'' · **''GEO_SOUTH''** · ''GEO_EAST'' · ''GEO_WEST'' | Beachten: aus ''GeoEntfernungSm'' (Seemeilen) wird ''GeoDistance**Nm**'' — die englische Abkürzung für die nautische Meile ist ''NM'', nicht ''SM''. Wer nur mechanisch „Sm → Nm" ersetzt, trifft es hier zufällig richtig; wer ''SeaMiles'' erwartet, findet nichts. ---- ===== 1. Typ, Radien, Fehlerwert ===== pub type GeoPos = struct { lat: f64; lon: f64; } // Grad ^ Funktion ^ Wert / Bedeutung ^ | ''GeoEarthRadius()'' | 6 371 008.8 m — mittlerer Erdradius | | ''GeoRadiusMoon()'' · ''GeoRadiusMars()'' | 1 737 400 m · 3 389 500 m | | ''GeoPosNew(lat, lon)'' | Position bauen | | ''GeoError()'' · ''GeoIsError(x)'' | NaN als Fehlerwert, wie in ''std.astro'' | | ''GeoLatValid(lat)'' · ''GeoLonValid(lon)'' · ''GeoPosValid(p)'' | Bereichsprüfung (−90…90 bzw. −180…180) | | ''GeoPosIsError(p)'' | ist eine der Komponenten NaN? | | ''GeoToRadians(grad)'' · ''GeoToDegrees(bogen)'' | Umrechnung | | ''GeoNormBearing(grad)'' | auf ''0…360'' bringen (''−10'' → ''350'') | | ''GeoNormDelta(grad)'' | Differenz auf ''−180…180'' bringen | ===== 2. Entfernung und Kurs ===== ^ Funktion ^ Rückgabe ^ Bedeutung ^ | ''GeoDistanceR(a, b, radius)'' | ''f64'' | Großkreisentfernung auf einer Kugel beliebigen Radius | | ''GeoDistance(a, b)'' | ''f64'' [m] | dieselbe mit dem Erdradius | | ''GeoDistanceKm(a, b)'' · ''GeoDistanceNm(a, b)'' | ''f64'' | in Kilometern bzw. **Seemeilen** (1852 m) | | ''GeoAngularDistance(a, b)'' | ''f64'' [**Grad**] | Entfernung ohne Radius — für Funkstrecken und Sichtbarkeit | | ''GeoBearing(a, b)'' | ''f64'' [Grad] | Anfangskurs | | ''GeoFinalBearing(a, b)'' | ''f64'' [Grad] | Kurs bei der Ankunft | | ''GeoDestination(start, kurs, strecke)'' | ''GeoPos'' | direktes Problem: wohin führt ein Kurs? | | ''GeoDestinationR(start, kurs, strecke, radius)'' | ''GeoPos'' | dasselbe auf anderem Körper | | ''GeoMidpoint(a, b)'' | ''GeoPos'' | Mitte des Großkreisbogens | > **Auf einem Großkreis ändert sich der Kurs unterwegs.** Hamburg → New York beginnt mit 293 Grad und endet mit 226 — ein Unterschied von 67 Grad. Wer einen **festen** Kurs steuern will, braucht die Loxodrome (Abschnitt 4); sie ist länger, aber ohne ständige Kurskorrektur zu fahren. > > ''GeoAngularDistance'' liefert bereits **Grad** — nicht noch einmal durch ''GeoToDegrees'' schicken. ===== 3. Abweichung von der Route ===== ^ Funktion ^ Rückgabe ^ Bedeutung ^ | ''GeoCrossTrack(punkt, von, nach)'' | ''f64'' [m] | Abstand zum Großkreis; **Vorzeichen** sagt die Seite | | ''GeoAlongTrack(punkt, von, nach)'' | ''f64'' [m] | wie weit entlang der Route der Punkt schon liegt | ===== 4. Loxodrome ===== ^ Funktion ^ Rückgabe ^ Bedeutung ^ | ''GeoRhumbBearing(a, b)'' | ''f64'' [Grad] | fester Kurs, der ans Ziel führt | | ''GeoRhumbDistance(a, b)'' | ''f64'' [m] | dessen Länge | ===== 5. Himmelsrichtungen und Sichtweite ===== ^ Funktion ^ Rückgabe ^ Bedeutung ^ | ''GEO_NORTH'', ''GEO_SOUTH'', ''GEO_EAST'', ''GEO_WEST'' | ''int64'' | Richtungskennungen (''N''/''S''/''E''/''W'' als Zeichen) | | ''GeoFromDms(grad, min, sek, richtung)'' | ''f64'' | Grad-Minuten-Sekunden zu Dezimalgrad — **exakt** über /60 und /3600 | | ''GeoLatHemisphere(lat)'' · ''GeoLonHemisphere(lon)'' | ''int64'' | passende Richtungskennung | | ''GeoCompassSector(kurs)'' | ''int64'' | 0 = N, 1 = NNO, … 15 = NNW; jeder Sektor 22.5 Grad, Nord symmetrisch um 0 | | ''GeoHorizon(hoehe)'' | ''f64'' [m] | Entfernung zum Horizont: ''R·acos(R/(R+h))'' | | ''GeoLineOfSight(a, hoeheA, b, hoeheB)'' | ''bool'' | reichen beide Horizonte zusammen über die Strecke? | > **Eine unbekannte Himmelsrichtung wird gemeldet, nicht stillschweigend als Nord gelesen** — anders als ''ParseDMS'' in [[lyx_-_programmiersprache:units:geo|std.geo]], das den Wert dort positiv zurückgibt ([[https://github.com/SEOLizer/LyX-Compiler/issues/1888|#1888]]). ===== 6. Beispiel ===== import std.geo.sphere; import std.io; fn zeig(n: pchar, v: f64, d: int64): void { Print(n); PrintLn(FloatToStr(v, d)); } fn BI(b: bool): int64 { if (b) { return 1; } return 0; } fn main(): int64 { var ham: GeoPos := GeoPosNew(53.5511, 9.9937); // Hamburg var muc: GeoPos := GeoPosNew(48.1351, 11.5820); // Muenchen var nyc: GeoPos := GeoPosNew(40.7128, 0.0 - 74.0060); // New York zeig("HH->M km : ", GeoDistanceKm(ham, muc), 1); zeig("HH->NYC km : ", GeoDistanceKm(ham, nyc), 1); zeig("HH->NYC sm : ", GeoDistanceNm(ham, nyc), 1); zeig("Anfangskurs HH->NYC: ", GeoBearing(ham, nyc), 2); zeig("Endkurs HH->NYC : ", GeoFinalBearing(ham, nyc), 2); zeig("Winkelabstand Grad : ", GeoAngularDistance(ham, nyc), 3); var mitte: GeoPos := GeoMidpoint(ham, nyc); Print("Mittelpunkt : "); Print(FloatToStr(mitte.lat, 3)); Print(" / "); PrintLn(FloatToStr(mitte.lon, 3)); var ziel: GeoPos := GeoDestination(ham, 180.0, 500000.0); // 500 km nach Sued Print("500 km Sued : "); Print(FloatToStr(ziel.lat, 4)); Print(" / "); PrintLn(FloatToStr(ziel.lon, 4)); zeig("Querabw. M zu Route: ", GeoCrossTrack(muc, ham, nyc) / 1000.0, 1); zeig("Laengsabw. km : ", GeoAlongTrack(muc, ham, nyc) / 1000.0, 1); zeig("Loxodromkurs : ", GeoRhumbBearing(ham, nyc), 2); zeig("Loxodromstrecke km : ", GeoRhumbDistance(ham, nyc) / 1000.0, 1); zeig("Horizont 10 m km : ", GeoHorizon(10.0) / 1000.0, 2); zeig("Horizont 10 km km : ", GeoHorizon(10000.0) / 1000.0, 1); Print("Sicht HH<->M? : "); PrintLn(IntToStr(BI(GeoLineOfSight(ham, 100.0, muc, 100.0)))); zeig("GMS 53 33 4 N : ", GeoFromDms(53.0, 33.0, 4.0, GEO_NORTH), 5); Print("Kompasssektor 200 : "); PrintLn(IntToStr(GeoCompassSector(200.0))); Print("Breite gueltig 91? : "); PrintLn(IntToStr(BI(GeoLatValid(91.0)))); zeig("Kurs -10 normiert : ", GeoNormBearing(0.0 - 10.0), 1); return 0; } HH->M km : 612.4 HH->NYC km : 6129.9 HH->NYC sm : 3309.9 Anfangskurs HH->NYC: 293.24 Endkurs HH->NYC : 226.07 Winkelabstand Grad : 55.128 Mittelpunkt : 55.243 / -38.234 500 km Sued : 49.0545 / 9.9937 Querabw. M zu Route: -505.3 Laengsabw. km : 346.3 Loxodromkurs : 257.25 Loxodromstrecke km : 6469.4 Horizont 10 m km : 11.29 Horizont 10 km km : 356.7 Sicht HH<->M? : 0 GMS 53 33 4 N : 53.55111 Kompasssektor 200 : 9 Breite gueltig 91? : 0 Kurs -10 normiert : 350.0 Drei Dinge lassen sich daran ablesen: * **Großkreis gegen Loxodrome:** 6130 km auf dem Großkreis, 6469 km auf festem Kurs — 339 km oder 5.5 % Umweg für den Verzicht auf ständige Kurskorrektur. Genau deshalb fliegen Flugzeuge Großkreise und segelten Schiffe Loxodromen. * **Der Kurs dreht sich unterwegs** um 67 Grad (293 → 226), der Loxodromkurs bleibt konstant bei 257. * **Die Sichtweite wächst mit der Wurzel der Höhe:** 10 m ergeben 11.3 km, 10 km ergeben 357 km — Faktor 1000 in der Höhe bringt nur Faktor 32 in der Weite. Hamburg und München sehen sich auch aus 100 m Höhe nicht: zwei Horizonte à 36 km reichen nicht über 612 km. Die **negative** Querabweichung Münchens (−505 km) sagt die Seite: München liegt südlich der Route Hamburg → New York. ---- Letzte Aktualisierung: 2026-09-07 — Unit auf **englische Namen** umgestellt: 34 Funktionen, vier Konstanten und die Parameternamen umbenannt (''GeoEntfernung'' → ''GeoDistance'', ''GeoKurs'' → ''GeoBearing'', ''GeoQuerabweichung'' → ''GeoCrossTrack'', ''GEO_SUED'' → ''GEO_SOUTH''); Umbenennungstabelle als Kasten aufgenommen. Beispiele gegen lyxc 1.2.2D übersetzt. Vorherige letzte Aktualisierung: 2026-09-01 — Seite neu angelegt aus ''std/geo/sphere.lyx''; Beispiel mit ''lyxc 1.1.16A'' gebaut und ausgeführt.