====== 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.