Calcolo del prodotto a croce di un vettore 2D

Da Wikipedia:

il prodotto incrociato è un’operazione binaria su due vettori in uno spazio euclideo tridimensionale che risulta in un altro vettore che è perpendicolare al piano contenente i due vettori di input.

Dato che la definizione è definita solo in tre ( o sette, uno e zero ) dimensioni, come si calcola il prodotto incrociato di due vettori 2d?

Ho visto due implementazioni. Uno restituisce un nuovo vettore (ma accetta solo un singolo vettore), l’altro restituisce uno scalare (ma è un calcolo tra due vettori).

Implementazione 1 (restituisce uno scalare):

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

Implementazione 2 (restituisce un vettore):

 Vector2D CrossProduct(const Vector2D & v) const { return Vector2D(vY, -vX); } 

Perché le diverse implementazioni? Per cosa dovrei usare l’implementazione scalare? Per cosa utilizzerei l’implementazione del vettore?

Il motivo per cui lo chiedo è perché sto scrivendo una class Vector2D e non so quale metodo usare.

L’implementazione 1 restituisce la grandezza del vettore che deriverebbe da un normale prodotto a croce 3D dei vettori di input, prendendo implicitamente i loro valori Z come 0 (ovvero trattando lo spazio 2D come un piano nello spazio 3D). Il prodotto a croce 3D sarà perpendicolare a tale piano e quindi avrà 0 componenti X e Y (quindi lo scalare restituito è il valore Z del vettore 3D di prodotti incrociati).

Si noti che la grandezza del vettore risultante dal prodotto incrociato 3D è uguale all’area del parallelogramma tra i due vettori, il che conferisce all’Implementazione 1 un altro scopo. Inoltre, quest’area è firmata e può essere utilizzata per determinare se la rotazione da V1 a V2 si sposta in senso antiorario o orario. Va anche notato che l’implementazione 1 è il determinante della matrice 2×2 costruita da questi due vettori.

L’implementazione 2 restituisce un vettore perpendicolare al vettore di input ancora nello stesso piano 2D. Non un prodotto trasversale nel senso classico ma coerente nel senso di “darmi un vettore perpendicolare”.

Si noti che lo spazio euclideo 3D viene chiuso sotto l’operazione cross product, ovvero un prodotto incrociato di due vettori 3D restituisce un altro vettore 3D. Entrambe le precedenti implementazioni 2D sono incoerenti con questo in un modo o nell’altro.

Spero che questo ti aiuti…

In breve: è una notazione abbreviata per un hack matematico.

Spiegazione lunga:

Non è ansible creare un prodotto incrociato con vettori nello spazio 2D. L’operazione non è definita lì.

Tuttavia, spesso è interessante valutare il prodotto incrociato di due vettori assumendo che i vettori 2D siano estesi al 3D impostando la loro coordinata z a zero. Questo è come lavorare con i vettori 3D sul piano xy.

Se estendi i vettori in questo modo e calcoli il prodotto incrociato di una tale coppia vettoriale estesa noterai che solo il componente z ha un valore significativo: xey sarà sempre zero.

Questo è il motivo per cui spesso il componente z del risultato viene semplicemente riportato come scalare. Questo scalare può ad esempio essere utilizzato per trovare l’avvolgimento di tre punti nello spazio 2D.

Da un punto di vista puramente matematico il prodotto incrociato nello spazio 2D non esiste, la versione scalare è l’hack e un prodotto cross 2D che restituisce un vettore 2D non ha alcun senso.

Un’altra proprietà utile del prodotto incrociato è che la sua grandezza è correlata al seno dell’angolo tra i due vettori:

| axb | = | a | . | B | . sine (theta)

o

sine (theta) = | axb | / (| a |. | b |)

Quindi, nell’implementazione 1 precedente, se b sono noti in anticipo come vettori unitari, il risultato di tale funzione è esattamente quel valore seno ().

Sto usando il prodotto cross 2d nel mio calcolo per trovare la nuova rotazione corretta per un object su cui viene applicato un vettore di forza in un punto arbitrario rispetto al suo centro di massa. (Lo scalare Z uno.)

L’implementazione 1 è il prodotto perp punto dei due vettori. Il miglior riferimento che io conosca per la grafica 2D è l’eccellente serie Graphics Gems . Se stai facendo scratch 2D, è molto importante avere questi libri. Volume IV ha un articolo intitolato “I piaceri di Perp Dot Products” che utilizza molti usi per questo.

Un uso importante del prodotto perp dot è quello di ottenere il sin scalato dell’angolo tra i due vettori, proprio come il prodotto punto restituisce il cos scalato dell’angolo. Naturalmente è ansible utilizzare insieme prodotti a punti e prodotti perp per determinare l’angolo tra due vettori.

Ecco un post su questo ed ecco l’articolo di Wolfram Math World.

Un’utile operazione vettoriale 2D è un prodotto incrociato che restituisce uno scalare. Lo uso per vedere se due bordi successivi in ​​un poligono si piegano a sinistra o a destra.

Dalla fonte Chipmunk2D :

 /// 2D vector cross product analog. /// The cross product of 2D vectors results in a 3D vector with only az 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; }