Vektoren, Methode

Nirvana

Aktives Mitglied
Hallo ihr lieben.
Ich möchte eine Methode schreiben, die überprüft ob zwei Vektoren parallel zueinander sind. SIe soll true zurückgeben wenn die parallel sind, sonst false

Habe es nun so versucht, in dem ich schaue ob der Multiplikationsfaktor gleich ist.
2 Vektoren:
(a//b) und (x//y)

(a//b) = v * (x//y)
a = v x
<=> a/x = v

b= v y
<=> b/y = v

Kontrolle ob die zwei v´s gleich sind

Aber da ist das problem der Division durch 0 - wenn eine Koordinate 0 ist. Ich glaub da gibt es weitaus elegantere Lösungen, vlt. hat wer eine Idee dazu?

LG
 
Im 2D-Raum kannst du überprüfen, ob
Code:
Math.atan2(x,y)[/c] gleich ist. Was aber, dann nicht berücksichtig wird ist, dass zwei Vektoren auch parallel sind, wenn sie entgegengesetzt sind, das muss noch extra überprüft werden, was bei deinem Code nicht notwendig ist, da sich das Vorzeichen rauskürzt.

Oder du verwendest einfach double: dann kommt NaN raus, den Fall müsstest du allerdings auch extra behandeln, denn [code]NaN==NaN
ergibt ja bekanntlich false.
 
Wenn ich z.B die Vektoren
(0//1)
(0//6) habe, diese sind offensichtlich parallel

Mit meiner impletierten methode:

v= 0/0 = NaN

v= 1/6

WIe meintesdt du das nun mit deinem Vorschlag (NaN==NaN)?
 
Sorry, Logikfehler meinerseits. In dem Fall funktioniert's sogar ohne extra Überprüfung, denn um bei deinem Bsp. zu bleiben:
Code:
NaN==1/6
ergibt ja true. Wenn du der Ansicht bist, das zwei Nullvektoren die selbe Richtung haben, müsstest du das allerdings extra behandeln. In dem Fall ist die Definition von NaN wirklich zu etwas zu gebrauchen. Ich hab hab den Spruch nicht mehr ganz im Kopf, aber: Keine Zahl (eben NaN) ist gleich jeder Zahl, auser KeinerZahl (womit wieder NaN gemeint ist).
 
Die beiden Richtungen normieren, und von den normierten Vektoren das Skalarprodukt (dot product) bilden. Wenn es 1 ist, sind sie parallel.
 
Ok, hatte die Def. von NaN vollkommen falsch in Erinnerung. KA wies richtig formuliert hies, aber dann müsstest du das halt extra behandeln:
Java:
double v1=a/b,v2=x/y;
boolean parallel= v1==v2 || (v1!=NaN&&a==0)||(v2!=NaN&&x==0);//||(v1!=NaN&&v2!=NaN)
 
Marco13 hab die methode und sie funktioniert.
Kann ich irgendwo den mathematischen hintegrund der methode nachlesen oder kannst du mir ihn erklären?.
 
Kann ich irgendwo den mathematischen hintegrund der methode nachlesen oder kannst du mir ihn erklären?.

Nein, das ist ein Geheimnis das nur ich kenne und niemandem verraten darf. Und im Internet findet man auch nichts. Ist ja geheim, du weißt schon.


:joke:


Das Dot-Produkt von normierten Vektoren entspricht einer Projektion des einen Vektors auf den anderen.
Code:
Zwei Vektoren (seien die normiert, also beide Länge 1)


|
|
|
|          /
|         /
|        /
|       /
|      /
|     /
|    /
|   /



Dot-Product bilden: Der eine wird auf den anderen projiziert




|
|
|            Den hier nach links draufprojizieren
|          /
| <----   /
|        /
| <---  /
|      /
| <-- /
|    /
|   /





|
|
|
||  <-- So sieht der draufprojizierte dann aus
||
||
||
||
||
||
||


Das dot-product beschreibt dann die LÄNGE des draufprojizierten Vektors.

Man sieht dass der draufprojizierte die Länge 1 hat (also das dot-Product 1 ergibt) wenn sie vorher parallel waren. Wenn sie genau senkrecht aufeinander standen, ist das dot-Product 0, weil der projizierte Vektor dann zu einem "Punkt im Ursprung des anderen" zusammenschnurrt. Funktioniert auch in 3D.
 
Wäre es dann nicht einfacher, zu schauen ob die normierten Vektoren identisch, bzw. entgegengesetzt sind? Oder hab ich da wieder nen Logikfehler drin, wenn ich annehme, das zwei parallele Vektoren wenn man sie normiert den gleichen bzw entgegengesetzen Vektor ergeben müssen?
 
Auch eine Option 😀 Man muss halt (wie auch beim Dot-Product) mit ein paar epsilons rumhantieren, aber es kommt auf's gleiche raus. Mit dem dot product bekommt man halt noch mehr infos (man kann daraus leicht den Winkel zwischen den Vektoren berechnen) aber wenn man die nicht braucht, ist das auch egal.
 

Zurück
Oben