2008-10-28 18 views
55

Von wikipedia:Berechnen eines Kreuzprodukts 2D Vektor

das Kreuzprodukt ist eine binäre Operation auf zwei Vektoren in einem dreidimensionalen euklidischen Raum, der in einem anderen Vektor ergibt, die senkrecht zur Ebene ist, welche die zwei Eingabevektoren.

Da die Definition nur in drei (or seven, one and zero) Abmessungen definiert ist, wie kann man das Kreuzprodukt von zwei 2D-Vektoren berechnen?

Ich habe zwei Implementierungen gesehen. Einer gibt einen neuen Vektor zurück (akzeptiert aber nur einen einzelnen Vektor), der andere gibt einen Skalar zurück (ist aber eine Berechnung zwischen zwei Vektoren).

Implementation 1 (gibt einen Skalar):

float CrossProduct(const Vector2D & v1, const Vector2D & v2) const 
{ 
    return (v1.X*v2.Y) - (v1.Y*v2.X); 
} 

Implementation 2 (gibt einen Vektor):

Vector2D CrossProduct(const Vector2D & v) const 
{ 
    return Vector2D(v.Y, -v.X); 
} 

Warum die unterschiedlichen Implementierungen? Wofür würde ich die skalare Implementierung verwenden? Wofür würde ich die Vektorimplementierung verwenden?

Der Grund, warum ich frage, ist, weil ich selbst eine Vector2D-Klasse schreibe und nicht weiß, welche Methode ich benutzen soll.

+5

Implementierung 2 ist falsch. Sie benötigen zwei Vektoren, um ein Kreuzprodukt zu bilden. – bobobobo

+6

Implementierung 2 dreht den angegebenen Vektor _v_ um -90 Grad. Substituieren -90 in & ldquor; x "= x cos & thgr; - ​​y sin & thgr; 'und & ldquor; y" = x sin & thgr; + y cos & thgr; Eine andere Variante dieser Implementierung wäre, Vector2D (-v.Y, v.X); 'um _90 um +90 Grad zu drehen. – legends2k

+0

@ legends2k: Es ist erwähnenswert, dass Implementierung 2 eine Erweiterung von [die Determinante zur Bewertung des Kreuzprodukts] verwendet (https: //en.wikipedia.org/wiki/Cross_product # Matrix_notation): Entferne einfach die letzte Zeile und Spalte. Eine solche Erweiterung hat immer 'N-1'-Operanden für' N'-Dimensionen. –

Antwort

84

Implementierung 1 gibt die Größe des Vektors zurück, die sich aus einem regulären 3D-Kreuzprodukt der Eingabevektoren ergeben würde, wobei ihre Z-Werte implizit als 0 genommen werden (d. H. Behandeln des 2D-Raums als Ebene im 3D-Raum). Das 3D-Kreuzprodukt wird senkrecht zu dieser Ebene sein und somit 0 X & Y-Komponenten aufweisen (somit ist der zurückgegebene Skalar der Z-Wert des 3D-Kreuzproduktvektors).

Beachten Sie, dass die Größe des aus 3D-Kreuzprodukt resultierenden Vektors auch gleich des Parallelogramms zwischen den beiden Vektoren ist, was Implementierung 1 einen anderen Zweck gibt. Zusätzlich ist dieser Bereich signiert und kann verwendet werden, um zu bestimmen, ob sich eine Drehung von V1 nach V2 gegen den Uhrzeigersinn oder im Uhrzeigersinn bewegt. Es sollte auch beachtet werden, dass die Implementierung 1 die Determinante der aus diesen beiden Vektoren aufgebauten 2x2-Matrix ist.

Implementierung 2 gibt einen Vektor senkrecht zum Eingabevektor in derselben 2D-Ebene zurück. Kein Kreuzprodukt im klassischen Sinne, sondern konsistent im Sinne von "Gib mir einen senkrechten Vektor".

Beachten Sie, dass der 3D-euklidische Raum unter der Kreuzproduktoperation geschlossen ist, dh ein Kreuzprodukt von zwei 3D-Vektoren gibt einen weiteren 3D-Vektor zurück. Beide der obigen 2D-Implementierungen stimmen auf die eine oder andere Weise nicht mit dieser überein.

Hope this helps ...

+4

Tatsächlich ist die Implementierung 2 ein Kreuzprodukt von v und der Einheitsvektor zeigt nach oben in der z-Richtung. – mattiast

+0

@mattiast: Wahr. Genau so wird die 2D-Perp-Operation in 3D beschrieben. –

+0

@mattiast: Implementierung 2 kann als eine Erweiterung der Verwendung einer [Determinante zur Berechnung des Cross-Produkts] (https://en.wikipedia.org/wiki/Cross_product#Matrix_notation) gedacht werden --- entfernen Sie einfach die letzte Zeile und Spalte. Es sollte angemerkt werden, dass Implementierung 1 äquivalent ist zu: 'DotProduct (a, CrossProduct (b)) ', was (sehr elegant!) Mit der Vorstellung eines" rechtwinkligen Punktprodukts "übereinstimmt (was diese Implementierung 1 auch ist) [und vielleicht genauer] bekannt als!). –

41

Kurz: Es ist eine Kurzschreibweise für eine mathematische Hack.

Lange Erklärung:

Sie können nicht ein Kreuzprodukt mit Vektoren in 2D-Raum tun. Die Operation ist dort nicht definiert.

jedoch oft ist es interessant, das Kreuzprodukt zweier Vektoren zu bewerten, unter der Annahme, dass die 2D-3D-Vektoren erweitert werden auf Null ihre z-Koordinate durch Einstellung. Dies entspricht dem Arbeiten mit 3D-Vektoren in der xy-Ebene.

Wenn Sie die Vektoren auf diese Weise erweitern und das Kreuzprodukt eines solchen erweiterten Vektorpaars berechnen, werden Sie feststellen, dass nur die Z-Komponente einen sinnvollen Wert hat: x und y sind immer Null.

Aus diesem Grund wird die z-Komponente des Ergebnisses oft einfach als Skalar zurückgegeben. Dieser Skalar kann zum Beispiel verwendet werden, um die Wicklung von drei Punkten im 2D-Raum zu finden.

Aus rein mathematischer Sicht existiert das Kreuzprodukt im 2D-Raum nicht, die skalare Version ist der Hack und ein 2D-Kreuzprodukt, das einen 2D-Vektor zurückgibt, macht überhaupt keinen Sinn.

9

Eine weitere nützliche Eigenschaft des Kreuzproduktes ist, dass seine Größe des Sinus des Winkels zwischen den beiden Vektoren in Beziehung steht:

| a x b | = | a | . | b | . Sinus (theta)

oder

Sinus (theta) = | a x b |/(| A |. | B |)

also bei der Umsetzung mehr als 1, wenn a und b im Voraus bekannt sind, das Ergebnis dieser Funktionseinheitsvektoren werden dann genau, dass sine() Wert.

+1

... das ist auch die doppelte Fläche des Dreiecks zwischen Vektor a und Vektor b. –

3

Ich verwende 2d Kreuzprodukt in meiner Berechnung die neue richtige Drehung für ein Objekt zu finden, die durch einen Kraftvektor an einem beliebigen Punkt im Verhältnis zu seiner Mitte der Masse beaufschlagt wird. (Der Skalar Z eins.)

3

Implementierung 1 ist das perp dot Produkt der beiden Vektoren. Die beste Referenz, die ich für 2D-Grafiken kenne, ist die exzellente Graphics Gems Serie. Wenn Sie Scratch 2D-Arbeit machen, ist es wirklich wichtig, diese Bücher zu haben. Band IV hat einen Artikel mit dem Titel "The Pleasures of Perp Dot Products", der sich über viele Anwendungen erstreckt.

Eine wichtige Verwendung von perp Skalarprodukt ist der skalierte sin des Winkels zwischen den beiden Vektoren, genau wie das Punktprodukt zu erhalten die skalierte cos des Winkels zurück. Natürlich können Sie Skalarprodukt und perp Skalarprodukt zusammen verwenden den Winkel zwischen zwei Vektoren zu bestimmen.

Here ist ein Beitrag dazu und here ist der Wolfram Math World Artikel.