Frage

Aus Wikipedia:

  

das Kreuzprodukt ist eine binäre Operation auf zwei Vektoren in einem dreidimensionalen euklidischen Raum, der in einem anderen Vektor ergibt, die zu der Ebene senkrecht ist, enthält, die zwei Eingangsvektoren.

Da die Definition nur in drei ( oder sieben, eins und null ) Abmessungen, wie kann man das Kreuzprodukt von zwei 2D-Vektoren berechnen?

Ich habe zwei Implementierungen gesehen. Man gibt einen neuen Vektor (aber akzeptiert nur einen einzigen Vektor), der andere ein skalare zurück (ist aber eine Berechnung zwischen zwei Vektoren).

Implementierung 1 (gibt einen Skalar):

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

Implementierung 2 (gibt einen Vektor):

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

Warum die unterschiedlichen Implementierungen? Was würde ich verwenden, um die skalare Implementierung? Was würde ich verwenden, um die Vektor-Implementierung für?

Der Grund, warum ich frage ist, weil ich eine Vector2D Klasse selbst bin zu schreiben und nicht wissen, welche Methode zu verwenden.

War es hilfreich?

Lösung

Umsetzung 1 führt den Betrag des Vektors, die von einem normalen 3D Kreuzprodukt der Eingangsvektoren, wobei die Z-Werte implizit als 0 (das heißt die Behandlung der 2D-Raum als eine Ebene im 3D-Raum) führen würde. Das 3D-Kreuzprodukt zu dieser Ebene senkrecht sein, und haben somit 0 X & Y-Komponenten (und somit der zurück Skalar ist der Z-Wert des 3D-Querproduktvektor).

Beachten Sie, dass die Größe des Vektors aus 3D-Kreuzprodukt zu dem auch gleich Bereich des Parallelogramms zwischen den beiden Vektoren, die Umsetzung 1 ein weiterer Zweck gibt. Darüber hinaus wird dieser Bereich signiert und kann verwendet werden, sei es von V1 Drehen um zu bestimmen, bewegt sich in einer gegen den Uhrzeigersinn oder im Uhrzeigersinn auf V2. Es sollte auch beachtet werden, dass die Umsetzung 1 ist die Determinante der 2x2-Matrix aus diesen beiden Vektoren aufgebaut.

Umsetzung 2 gibt einen Vektor senkrecht zu dem Eingangsvektor immer noch in derselben 2D-Ebene. Kein Kreuzprodukt im klassischen Sinne, aber konsequent in dem „gib mir einen senkrechten Vektor“ Sinne.

Beachten Sie, dass 3D-euklidischen Raum unter dem Kreuzprodukt Betrieb geschlossen ist - das heißt, ein Kreuzprodukt von zwei 3D-Vektoren eine weitere 3D-Vektor zurückgibt. Beide oben genannten 2D-Implementierungen sind nicht mit, dass in der einen oder anderen.

Hope, das hilft ...

Andere Tipps

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

Lange Erklärung:

Sie können nicht ein Kreuzprodukt mit Vektoren in 2D-Raum tun. Der Betrieb wird dort nicht definiert ist.

Doch oft ist es interessant, das Kreuzprodukt zweier Vektoren zu bewerten unter der Annahme, dass die 2D-Vektoren zu 3D, indem erweitert werden ihre auf Null z-Koordinate. Dies ist das gleiche wie bei 3D-Vektoren auf der xy-Ebene arbeiten.

Wenn Sie die Vektoren, die Art und Weise erweitern und das Kreuzprodukt eines solchen erweiterten Vektorpaar berechnen werden Sie feststellen, dass nur die z-Komponente einen sinnvollen Wert hat:. X und y immer gleich Null sein

Das ist der Grund, warum die z-Komponente des Ergebnisses wird oft einfach als ein Skalar zurückgegeben. Dieser Skalar kann beispielsweise verwendet werden, die Wicklung von drei Punkten im 2D-Raum zu finden.

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

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 1 oben, wenn a und b im Voraus bekannt sind Einheitsvektoren zu sein, dann ist das Ergebnis dieser Funktion ist genau das sine () Wert.

1 die Implementation perp Skalarprodukt der beiden Vektoren. Die beste Referenz ich für 2D-Grafik kennen, ist das ausgezeichnete Graphics Gems Serie. Wenn Sie kratzen 2D-Arbeit sind, dann ist es wirklich wichtig diese Bücher zu haben. Band IV hat einen Artikel mit dem Titel „The Pleasures of Perp Dot-Produkte“, die für sie über eine Menge von Anwendungen geht.

Eine wichtige Anwendung von perp Skalarprodukt ist die skalierte sin des Winkels zwischen den beiden Vektoren zu erhalten, ebenso wie die Skalarprodukt gibt den skalierten cos des Winkels . Natürlich können Sie Skalarprodukt und perp Skalarprodukt zusammen, um den Winkel zwischen zwei Vektoren zu bestimmen.

Hier ist ein Post auf sie und < a href = "http://mathworld.wolfram.com/PerpDotProduct.html" rel = "nofollow"> hier ist die Wolfram Math Welt Artikel.

Ich bin mit 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. (Die skalare Z ein.)

Eine nützliche 2D-Vektor-Operation ist ein Kreuzprodukt, die einen skalaren zurückgibt. Ich benutze es, um zu sehen, wenn zwei aufeinanderfolgende Kanten in einem Polygon Kurve nach links oder rechts.

Von der Chipmunk2D Quelle:

/// 2D vector cross product analog.
/// The cross product of 2D vectors results in a 3D vector with only a z component.
/// This function returns the magnitude of the z value.
static inline cpFloat cpvcross(const cpVect v1, const cpVect v2)
{
        return v1.x*v2.y - v1.y*v2.x;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top