@Frühlingsrolle.
Nur ein kleiner Hinweis zu Deinen Routinen: Man darf eine Fließkommazahl wie Double, Extended
nie auf Gleichheit prüfen, weil dies wider Erwartung (fast) nie zutrifft:
Delphi-Quellcode:
function TVec3.IsPerpendicular: Boolean;
...
bRes := Scalar(FX, FY, FZ) = 0.0; // Falsch!
...
Der Grund dafür sind einerseits
arithmetische Rundungsfehler in vorangegangenen Berechnungen. Darüber hinaus ist es generell nicht möglich,
unendlich viele reelle Zahlen mit einer
endlichen Anzahl von Bits (Double: 64 Bits; Extended: 80 Bits) darzustellen. Allein bei der
binären Codierung der Dezimalzahlen entstehen daher unvermeidbare Rundungsfehler.
Man sollte daher stets einen unscharfen Fließkomma-Vergleich machen. Man kann dazu z. B. die vorhandene Math-Funktion
Math.SameValue(Ist, Soll, Abs_Toleranz)
verwenden.
Delphi-Quellcode:
CONST
Gleich_Toleranz = 1E-15; // für Double
function TVec3.IsPerpendicular: Boolean;
...
bRes := SameValue(Scalar(FX, FY, FZ), 0.0, Gleich_Toleranz);
...
Empfehlenswert wäre auch die durchgängige Benutzung des Typs Extended anstelle von Double. Ich persönlich benutze für meine – zugegeben recht umfangreichen Berechnungen – oft die Multipräzisions-Arithmetik-Bibliothek von Wolfgang Ehrhardt mit 100 ... 200 Stellen (320 … 640 Bits), wo ich nach erfolgten Berechnungen die Rechenergebnisse zu Extended konvertiere.
Gruß, Andreas