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