Forum-Archiv: Norm Methode - Juli 2019

Re: Forum-Archiv: Norm Methode - Juli 2019

von gelöscht -
Anzahl Antworten: 0
Hi,

das ist kein Bug, sondern ein häufig auftretendes Verständnisproblem:

Es handelt sich ja nicht um einen x,y,z-Vektor, sondern um einen homogenen Vektor mit 4 Tupeln: (x,y,z,w).

Der Konstruktor erzeugt standardmäßig dabei einen homogenen Punktvektor mit w=1. Wir haben nach Aufruf des Konstruktors also nicht (-1,-2, 0), sondern (-1,-2, 0, 1)!

Zur Erinnerung: Richtungen sind bei homogenen Vektoren durch einen w-Tupel = 0 gekennzeichnet, Punkte durch einen w-Tupel != 0, vorzugsweise 1.

Für die Längenberechnung wird aber der w-Faktor naturgemäß nicht mitberechnet, sondern nur sqrt(x*x+y*y+z*z),
in diesem Falle kommt da bei Length sqrt(5) = 2.23606801 raus, passt also! 🙂

Die Methode CHVector::Norm() berücksichtigt bei der Normierung auch den w-Tupel. Es handelt sich also um eine homogene Normierung, in der alle Tupel dann durch sqrt(6) geteilt werden. Der Gesamtbetrag des Vektors ist zwar danach eins, die Länge des Vektor ist aber 0.912870884, da Length ja den w-Tupel nicht mitberücksichtigen darf. Passt also auch! 🙂

Was du vermultlich anwenden wolltest, ist nicht die Methode CHVector::Norm(), sondern die Methode CHVector::Normal(), diese setzt den w-Tupel auf 0 und berechnet erst danach die Länge, also:

CHVector temp3vector(-1, -2, 0);
length1 = temp3vector.Length(); //= 2.23606801
temp3vector.Normal();
length1 = temp3vector.Length(); //= 1.00000000

Falls du danach aus temp3vector wieder einen Punktvektor machen willst, und keinen Richtungsvektor, solltest du danach noch die Methode CHVector::MakePoint(); aufrufen!

Ich hoffe, ich konnte dir helfen!
Viele Grüße
Tobi