Domanda

Da wikipedia:

  

il prodotto incrociato è un'operazione binaria su due vettori in uno spazio euclideo tridimensionale che si traduce in un altro vettore 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(v.Y, -v.X);
}

Perché le diverse implementazioni? Per cosa dovrei usare l'implementazione scalare? Per cosa utilizzerei l'implementazione vettoriale?

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

È stato utile?

Soluzione

L'implementazione 1 restituisce l'entità del vettore che risulterebbe da un normale prodotto incrociato 3D dei vettori di input, prendendo i loro valori Z implicitamente come 0 (cioè trattando lo spazio 2D come un piano nello spazio 3D). Il prodotto incrociato 3D sarà perpendicolare a quel piano e quindi avrà 0 X & amp; Componenti Y (quindi lo scalare restituito è il valore Z del vettore prodotto incrociato 3D).

Si noti che la grandezza del vettore risultante dal prodotto incrociato 3D è uguale alla area del parallelogramma tra i due vettori, il che dà allo scopo 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 inoltre notato che l'implementazione 1 è il fattore determinante della matrice 2x2 costruita da questi due vettori.

L'implementazione 2 restituisce un vettore perpendicolare al vettore di input sempre sullo stesso piano 2D. Non un prodotto incrociato nel senso classico ma coerente nel "mi dai un vettore perpendicolare" senso.

Si noti che lo spazio euclideo 3D è chiuso sotto l'operazione di prodotto incrociato, ovvero un prodotto incrociato di due vettori 3D restituisce un altro vettore 3D. Entrambe le implementazioni 2D di cui sopra sono incompatibili con quella in un modo o nell'altro.

Spero che questo aiuti ...

Altri suggerimenti

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

Spiegazione lunga:

Non puoi realizzare un prodotto incrociato con vettori nello spazio 2D. L'operazione non è definita qui.

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

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

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

Da un puro punto di vista matematico il prodotto incrociato nello spazio 2D non esiste, la versione scalare è l'hack e un prodotto incrociato 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:

  

| a x b | = | a | . | B | . sine (theta)

o

  

seno (theta) = | a x b | / (| a |. | b |)

Quindi, nell'implementazione 1 sopra, se a e b sono noti in anticipo come vettori di unità, il risultato di quella funzione è esattamente quel valore sine ().

L'implementazione 1 è il prodotto punto per punto dei due vettori. Il miglior riferimento che conosco per la grafica 2D è l'eccellente serie Graphics Gems . Se stai facendo un lavoro in 2D, è davvero importante avere questi libri. Il volume IV ha un articolo chiamato "I piaceri dei prodotti Perp Dot" questo va oltre molti usi per questo.

Un uso importante del prodotto punto per punto è ottenere il sin ridimensionato dell'angolo tra i due vettori, proprio come il prodotto punto restituisce il cos ridimensionato dell'angolo. Ovviamente puoi usare prodotto punto e prodotto punto insieme per determinare l'angolo tra due vettori.

Qui c'è un post su di esso e < a href = "http://mathworld.wolfram.com/PerpDotProduct.html" rel = "nofollow"> qui è l'articolo di Wolfram Math World.

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

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

Dalla Chipmunk2D fonte:

/// 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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top