Cálculo de un producto Cross Vector 2D

De la wikipedia:

el producto cruzado es una operación binaria en dos vectores en un espacio euclidiano tridimensional que da como resultado otro vector que es perpendicular al plano que contiene los dos vectores de entrada.

Dado que la definición solo se define en tres ( o siete, uno y cero ) dimensiones, ¿cómo se calcula el producto cruzado de dos vectores 2D?

He visto dos implementaciones. Uno devuelve un nuevo vector (pero solo acepta un único vector), el otro devuelve un escalar (pero es un cálculo entre dos vectores).

Implementación 1 (devuelve un escalar):

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

Implementación 2 (devuelve un vector):

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

¿Por qué las diferentes implementaciones? ¿Para qué usaría la implementación escalar? ¿Para qué usaría la implementación del vector?

La razón por la que pregunto es porque estoy escribiendo una clase Vector2D y no sé qué método usar.

La implementación 1 devuelve la magnitud del vector que resultaría de un producto 3D cruzado regular de los vectores de entrada, tomando sus valores Z implícitamente como 0 (es decir, tratando el espacio 2D como un plano en el espacio 3D). El producto de cruce 3D será perpendicular a ese plano y, por lo tanto, tendrá 0 componentes X e Y (por lo tanto, el escalar devuelto es el valor Z del vector de producto cruzado 3D).

Tenga en cuenta que la magnitud del vector resultante del producto en 3D cruzado también es igual al área del paralelogramo entre los dos vectores, lo que le da a Implementación 1 otro propósito. Además, esta área está firmada y puede usarse para determinar si la rotación de V1 a V2 se mueve en sentido antihorario o en el sentido de las agujas del reloj. También debe observarse que la implementación 1 es el determinante de la matriz 2×2 construida a partir de estos dos vectores.

La implementación 2 devuelve un vector perpendicular al vector de entrada aún en el mismo plano 2D. No es un producto cruzado en el sentido clásico, sino consistente en el sentido de “dame un vector perpendicular”.

Tenga en cuenta que el espacio euclidiano 3D se cierra bajo la operación de productos cruzados, es decir, un producto cruzado de dos vectores 3D devuelve otro vector 3D. Ambas implementaciones 2D anteriores son inconsistentes con eso de una forma u otra.

Espero que esto ayude…

En resumen: es una notación abreviada para un truco matemático.

Larga explicación

No puede hacer un producto cruzado con vectores en el espacio 2D. La operación no está definida allí.

Sin embargo, a menudo es interesante evaluar el producto cruzado de dos vectores suponiendo que los vectores 2D se extienden a 3D estableciendo su coordenada z a cero. Esto es lo mismo que trabajar con vectores 3D en el plano xy.

Si extiende los vectores de esa manera y calcula el producto cruzado de dicho par vector extendido, notará que solo el componente z tiene un valor significativo: xey siempre serán cero.

Esa es la razón por la cual el componente z del resultado a menudo simplemente se devuelve como un escalar. Este escalar se puede utilizar, por ejemplo, para encontrar el devanado de tres puntos en el espacio 2D.

Desde un punto de vista puramente matemático, el producto cruzado en el espacio 2D no existe, la versión escalar es el truco y un producto 2D cruzado que devuelve un vector 2D no tiene ningún sentido.

Otra propiedad útil del producto cruzado es que su magnitud está relacionada con el seno del ángulo entre los dos vectores:

| axb | = | a | . | b | . seno (theta)

o

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

Entonces, en la implementación 1 anterior, si a y b se conocen de antemano como vectores unitarios, el resultado de esa función es exactamente ese valor sinusoidal ().

Estoy usando 2d producto cruzado en mi cálculo para encontrar la nueva rotación correcta para un objeto que está siendo actuado por un vector de fuerza en un punto arbitrario relativo a su centro de masa. (El escalar Z uno).

Implementación 1 es el producto punto perp de los dos vectores. La mejor referencia que conozco para gráficos 2D es la excelente serie Graphics Gems . Si está haciendo scratch en 2D, es realmente importante tener estos libros. El Volumen IV tiene un artículo llamado “Los placeres de los puntos de Perp” que abarca muchos usos para él.

Uno de los usos principales del producto perp dot es obtener el sin escalado del ángulo entre los dos vectores, al igual que el producto escalar devuelve el cos reducido del ángulo. Por supuesto, puede usar productos dot y perp dot juntos para determinar el ángulo entre dos vectores.

Aquí hay una publicación y aquí está el artículo de Wolfram Math World.

Una operación de vector 2D útil es un producto cruzado que devuelve un escalar. Lo uso para ver si dos bordes sucesivos en un polígono doblan hacia la izquierda o hacia la derecha.

De la fuente de 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; }