import std.geo.sphere;
Großkreisrechnung mit f64-Grad: Entfernung, Kurs, Zielpunkt, Quer- und Längsabweichung, Loxodrome, Sichtweite. Ergänzt 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.
→ std.geodesy (Ellipsoid statt Kugel) · std.geo · std.astro.guidance · Mathematik-Units · Guide: Navigation und Wegpunkte
<WRAP center round important 90%> 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 GeoDistanceNm — 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.
</WRAP>
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 |
| 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.
GeoAngularDistanceliefert bereits Grad — nicht noch einmal durchGeoToDegreesschicken.
| 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 |
| Funktion | Rückgabe | Bedeutung |
|---|---|---|
GeoRhumbBearing(a, b) | f64 [Grad] | fester Kurs, der ans Ziel führt |
GeoRhumbDistance(a, b) | f64 [m] | dessen Länge |
| 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? |
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:
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.