====== std.coordinates.transform — Zylinder- und Kugelkoordinaten ====== ''import std.coordinates.transform;'' Umrechnung zwischen kartesischen Koordinaten ([[lyx_-_programmiersprache:units:coordinates:vec3|V3]]), Zylinderkoordinaten und **zwei** Zählweisen von Kugelkoordinaten. → [[lyx_-_programmiersprache:units:coordinates|std.coordinates Übersicht]] · [[lyx_-_programmiersprache:units:coordinates:vec3|std.coordinates.vec3]] ---- ===== 1. Zylinderkoordinaten ===== pub type Cyl = struct { r: f64; phi: f64; z: f64; } ^ Signatur ^ Zweck ^ | ''CylNew(r: f64, phi: f64, z: f64): Cyl'' | bauen | | ''CylToCart(c: Cyl): V3'' | nach kartesisch | | ''CartToCyl(v: V3): Cyl'' | zurück | ---- ===== 2. Kugelkoordinaten — zwei Zählweisen ===== pub type SphPolar = struct { r: f64; theta: f64; phi: f64; } // theta vom Nordpol pub type SphElev = struct { r: f64; elev: f64; azim: f64; } // elev vom Horizont ^ Signatur ^ Zweck ^ | ''SphPolarNew(r, theta, phi): SphPolar'' · ''SphPolarToCart'' · ''CartToSphPolar'' | Polarwinkel-Zählweise | | ''SphElevNew(r, elev, azim): SphElev'' · ''SphElevToCart'' · ''CartToSphElev'' | Elevations-Zählweise | | ''SphPolarToElev(s: SphPolar): SphElev'' · ''SphElevToPolar(s: SphElev): SphPolar'' | zwischen beiden | **Beide heißen umgangssprachlich „Kugelkoordinaten", und ihre Winkel unterscheiden sich um 90°.** Die Mathematik zählt den Polarwinkel θ vom **Nordpol**, Astronomie und Navigation die Elevation von der **Horizontebene**. Ein Wert, der in der falschen Zählweise gelesen wird, ergibt einen Punkt auf der anderen Seite des Kegels — plausibel aussehend und falsch. **Eine Funktion, die einfach ''ToSpherical'' hieße, wäre die Einladung zum Fehler** — sie ließe genau die Frage offen, an der es hängt. Deshalb zwei Typen mit sprechenden Namen (''SphPolar'' für die Physik, ''SphElev'' für Geodäsie und Navigation), zwei Funktionspaare und die ausdrückliche Umrechnung dazwischen. Der Prüflauf der Unit hält beide gegeneinander. ---- ===== 3. Winkelmaße ===== ^ Signatur ^ Zweck ^ | ''DegToRad(deg: f64): f64'' | Grad → Bogenmaß | | ''RadToDeg(rad: f64): f64'' | Bogenmaß → Grad | **Alle Winkel dieser Unit sind Bogenmaß.** Die beiden Funktionen stehen hier, damit man an der Aufrufstelle umrechnet und nicht im Kopf. ---- ===== 4. Beispiel ===== unit main; import std.coordinates.vec3; import std.coordinates.transform; import std.io; import std.string; fn main(): int64 { var p: V3 := V3New(3.0, 0.0, 4.0); var s: SphElev := CartToSphElev(p); PrintLn(StrConcat("Entfernung: ", FloatToStr(s.r, 3))); PrintLn(StrConcat("Elevation: ", FloatToStr(RadToDeg(s.elev), 2))); PrintLn(StrConcat("Azimut: ", FloatToStr(RadToDeg(s.azim), 2))); var pol: SphPolar := SphElevToPolar(s); PrintLn(StrConcat("Polarwinkel: ", FloatToStr(RadToDeg(pol.theta), 2))); return 0; } ---- Letzte Aktualisierung: 2026-09-07 — Begründung der zwei Kugelkoordinaten-Typen geschärft: ein gemeinsames ''ToSpherical'' wäre die Einladung zum Fehler, weil die beiden Zählweisen sich um 90° unterscheiden. Vorherige letzte Aktualisierung: 2026-09-06 — Seite neu angelegt; erhoben aus ''std/coordinates/transform.lyx''.