std.coordinates.transform — Zylinder- und Kugelkoordinaten

import std.coordinates.transform;

Umrechnung zwischen kartesischen Koordinaten (V3), Zylinderkoordinaten und zwei Zählweisen von Kugelkoordinaten.

std.coordinates Übersicht · 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.