====== std.coordinates.vec3 — Vektoren in f64 ====== ''import std.coordinates.vec3;'' Dreidimensionale Vektoren in ''f64'': Grundrechenarten, Skalar- und Kreuzprodukt, Norm, Winkel, Projektion. Der Typ, den [[lyx_-_programmiersprache:units:quat|std.quat]] zum Drehen braucht und [[lyx_-_programmiersprache:units:vector|std.vector]] mit seinen ganzzahligen ''Vec2'' nicht liefern kann. → [[lyx_-_programmiersprache:units:coordinates|std.coordinates Übersicht]] · [[lyx_-_programmiersprache:units:coordinates:transform|std.coordinates.transform]] · [[lyx_-_programmiersprache:units:matrix|std.matrix]] ---- ===== 1. Typ und Fehlerwert ===== pub type V3 = struct { x: f64; y: f64; z: f64; } ^ Signatur ^ Zweck ^ | ''V3New(x: f64, y: f64, z: f64): V3'' | Vektor bauen | | ''V3Zero(): V3'' · ''V3UnitX(): V3'' · ''V3UnitY(): V3'' · ''V3UnitZ(): V3'' | Nullvektor und Einheitsvektoren | | ''V3Error(): V3'' | Vektor aus NaN | | ''V3IsError(v: V3): bool'' | Prüft, ob eine Komponente NaN ist | | ''V3ErrorValue(): f64'' · ''V3IsErrorValue(x: f64): bool'' | derselbe Fehlerwert als Skalar | Wie in [[lyx_-_programmiersprache:units:aero|std.aero]] und [[lyx_-_programmiersprache:units:astro|std.astro]] ist der Fehlerwert **NaN**: ein Nullvektor wäre ein gültiges Ergebnis und damit als Fehlermeldung untauglich. ---- ===== 2. Rechnen ===== ^ Signatur ^ Zweck ^ | ''V3Add(a: V3, b: V3): V3'' · ''V3Sub(a: V3, b: V3): V3'' | Summe, Differenz | | ''V3Scale(v: V3, s: f64): V3'' · ''V3Neg(v: V3): V3'' | Streckung, Gegenvektor | | ''V3Dot(a: V3, b: V3): f64'' | Skalarprodukt | | ''V3Cross(a: V3, b: V3): V3'' | Kreuzprodukt | | ''V3Triple(a: V3, b: V3, c: V3): f64'' | Spatprodukt — das Volumen des aufgespannten Parallelepipeds | | ''V3Lerp(a: V3, b: V3, t: f64): V3'' | lineare Zwischenwerte | ---- ===== 3. Länge, Richtung, Winkel ===== ^ Signatur ^ Zweck ^ | ''V3Norm(v: V3): f64'' | Betrag | | ''V3Norm2(v: V3): f64'' | Betragsquadrat — **ohne Wurzel**, für Vergleiche der schnellere Weg | | ''V3Normalize(v: V3): V3'' | Einheitsvektor; beim Nullvektor der Fehlerwert | | ''V3Distance(a: V3, b: V3): f64'' | Abstand zweier Punkte | | ''V3Angle(a: V3, b: V3): f64'' | eingeschlossener Winkel in Bogenmaß | | ''V3Project(a: V3, b: V3): V3'' | Anteil von ''a'' **entlang** ''b'' | | ''V3Reject(a: V3, b: V3): V3'' | Anteil von ''a'' **senkrecht zu** ''b'' | ''V3Project'' und ''V3Reject'' ergänzen sich: zusammen ergeben sie wieder ''a''. Das ist der übliche Weg, eine Geschwindigkeit in „längs" und „quer" zu zerlegen — etwa Wind in Gegen- und Seitenwind. ---- ===== 4. Beispiel ===== unit main; import std.coordinates.vec3; import std.io; import std.string; fn main(): int64 { var a: V3 := V3New(3.0, 0.0, 4.0); var b: V3 := V3New(1.0, 0.0, 0.0); PrintLn(StrConcat("Betrag: ", FloatToStr(V3Norm(a), 3))); PrintLn(StrConcat("laengs b: ", FloatToStr(V3Norm(V3Project(a, b)), 3))); PrintLn(StrConcat("quer zu b: ", FloatToStr(V3Norm(V3Reject(a, b)), 3))); PrintLn(StrConcat("Winkel (rad):", FloatToStr(V3Angle(a, b), 4))); return 0; } ---- Letzte Aktualisierung: 2026-09-06 — Seite neu angelegt; erhoben aus ''std/coordinates/vec3.lyx''.