Pregunta

De wikipedia:

  

el producto cruzado es una operación binaria en dos vectores en un espacio euclidiano tridimensional que da como resultado otro vector 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 solo 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(v.Y, -v.X);
}

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

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

¿Fue útil?

Solución

La implementación 1 devuelve la magnitud del vector que resultaría de un producto cruzado 3D 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 cruzado 3D será perpendicular a ese plano, y por lo tanto tendrá 0 X & amp; Componentes Y (por lo tanto, el valor escalar devuelto es el valor Z del vector de producto cruzado 3D).

Tenga en cuenta que la magnitud del vector resultante del producto cruzado 3D también es igual al área del paralelogramo entre los dos vectores, lo que le da a la Implementación 1 otro propósito. Además, esta área está firmada y se puede usar para determinar si la rotación de V1 a V2 se mueve en sentido contrario a las agujas del reloj o en el sentido de las agujas del reloj. También se debe tener en cuenta que la implementación 1 es el determinante de la matriz 2x2 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, pero es consistente en el " dame un vector perpendicular " sentido.

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

Espero que esto ayude ...

Otros consejos

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

Explicación larga:

No puedes 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 extiendan a 3D al establecer su coordenada z en cero. Esto es lo mismo que trabajar con vectores 3D en el plano xy.

Si extiendes los vectores de esa manera y calculas el producto cruzado de un par de vectores tan extendido, notarás que solo el componente z tiene un valor significativo: xey siempre serán cero.

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

Desde un punto de vista matemático puro, el producto cruzado en el espacio 2D no existe, la versión escalar es el truco y un producto cruzado 2D 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:

  

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

o

  

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

Por lo tanto, en la implementación 1 anterior, si se sabe de antemano que a y b son vectores unitarios, entonces el resultado de esa función es exactamente ese valor seno ().

La implementación 1 es el producto de punto perp de los dos vectores. La mejor referencia que conozco para gráficos 2D es la excelente serie Graphics Gems . Si estás haciendo un trabajo en 2D, es muy importante tener estos libros. El Volumen IV tiene un artículo llamado "Los placeres de los productos de puntos de Perp" eso le da muchos usos.

Un uso importante de producto de punto perp es obtener el sin escalado del ángulo entre los dos vectores, al igual que el producto de punto devuelve el cos escalado del ángulo. Por supuesto, puede utilizar punto producto y perp punto producto juntos para determinar el ángulo entre dos vectores.

Aquí hay una publicación en ella y < a href = "http://mathworld.wolfram.com/PerpDotProduct.html" rel = "nofollow"> aquí es el artículo de Wolfram Math World.

Estoy utilizando el producto cruzado 2d en mi cálculo para encontrar la nueva rotación correcta para un objeto sobre el que actúa un vector de fuerza en un punto arbitrario en relación con su centro de masa. (El escalar Z uno.)

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

De la fuente Chipmunk2D :

/// 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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top