2010-03-28 10 views
6

Tengo el siguiente fragmento de pseudo-C/Java/C# código:¿Cómo calcular el producto cruzado?

int a[]= { 30, 20 }; 
int b[] = { 40, 50 }; 
int c[] = {12, 12}; 

¿Cómo calculo el producto cruzado ABxAC?

+1

De su pregunta anterior - "¿Cómo calculo programáticamente el producto de punto/producto cruzado?" Presumiblemente, el signo es el signo de cualquiera que sea el resultado de ese cálculo, así que diría que es adivino. –

+0

¿Por qué el título es producto de punto pero la etiqueta es producto cruzado? – kennytm

+0

@KennyTM: reparado. Eso es porque primero pensó que los productos de cruz y punto son iguales. –

Respuesta

6

La solución que le dieron en su última pregunta básicamente agrega un Z = 0 para todos sus puntos. En los vectores tan extendidos, calcula producto cruzado. Geométricamente, el producto cruzado produce un vector que es ortogonal a los dos vectores utilizados para el cálculo, ya que ambos vectores se encuentran en el plano XY, el resultado solo tendrá un componente Z. El signo de esa componente z indica si el vector está mirando hacia arriba o hacia abajo en el plano XY. Ese signo depende de que AB esté en el sentido de las agujas del reloj o en el sentido de las agujas del reloj entre sí. Esto a su vez significa que el signo del componente z le muestra si el punto que está mirando se encuentra a la izquierda oa la derecha de la línea que está en AB.

Así, con la productos cruzados de dos vectores A y B es el vector

AxB = (AyBz − AzBy, AzBx − AxBz, AxBy − AyBx) 

con Az y Bz es cero lo que queda es el tercer componente de este vector

AxBy - AyBx 

Con A siendo el vector del punto a a b, y B es el vector del punto a a c significa

Ax = (b[x]-a[x]) 
Ay = (b[y]-a[y]) 
Bx = (c[x]-a[x]) 
By = (c[y]-a[y]) 

dando

AxBy - AyBx = (b[x]-a[x])*(c[y]-a[y])-(b[y]-a[y])*(c[x]-a[x]) 

que es un escalar, el signo de que escalar le dirá wether punto C se encuentra a la izquierda oa la derecha del vector AB

Aternatively se puede ver en stack overflow o gamedev

+0

@Harald Scheirich: gracias por la explicación detallada y excelentes enlaces. ¿Querías decir * "con Az y Bz siendo cero ..." *? (No me atrevo a editar su respuesta) – SyntaxT3rr0r

+0

@Harald Scheirich: ¿no es exactamente el mismo código que el que dio tzaman? (No sé quién lo votó en contra) – SyntaxT3rr0r

+0

@Wizard Sí, es el mismo cálculo, la votación podría haber comenzado con el título y el tema de esta pregunta que se cambia (Dunoo que lo hizo) –

2

El cross product es un vector, no tiene "un signo".

¿Te refieres al scalar (dot) product? Si lo haces, entonces eso se calcula como para un par de vectores [a, b, c] • [d, e, f] como ad + be + cf, por lo que el signo de esa expresión es el signo del producto punto.

Calcular el signo sin hacer las multiplicaciones y las adiciones probablemente no sea más rápido que simplemente hacerlas.

+0

@unwind: Mi mal, pensé que el "producto" de punto y el producto cruzado eran idénticos, pero, sí, de hecho estoy detrás del "producto de punto", que también es el "escalar" producto ": http://en.wikipedia.org/wiki/Dot_product – SyntaxT3rr0r

+0

No tenía razón en primer lugar, no está buscando el producto escalar, no le dará si su punto es hacia la izquierda o hacia la derecha de tu linea –

2

Dado que los tres puntos tienen solo dos componentes, supondré que el componente z para los tres es cero. Eso significa que los vectores AB y BC están en el plano xy, por lo que el producto cruzado es un vector que apunta en la dirección z, con sus componentes x e y igual a cero.

Si con "signo" quieres decir si apunta en la dirección z positiva o negativa, el cálculo te dirá eso.

En su caso, los dos vectores son AB = (10, 30, 0) y AC = (-18, -8, 0). Si tomo el producto cruzado de esos dos, obtengo el vector AB X AC = (0, 0, 460). ¿Quiere decir que esto tiene un signo positivo porque el componente z es positivo? Si es así, esa es su respuesta.

ACTUALIZACIÓN: Si es el producto escalar desea, es negativo en este caso:

AB = AC punto -180 -240 + 0 = -420.

+0

Respuesta correcta ... Desafortunadamente cambió la pregunta :). – svens

+0

Eso es lo que aborda mi actualización. Los dos he cubierto. – duffymo

1

Al leer la pregunta que ha vinculado, parece que desea el signo del componente z del producto cruzado (suponiendo 0 valor z para AB y AC); para indicar en qué lado de la línea AB se encuentra el punto C.
Suponiendo que ese sea el caso, todo lo que necesita es el signo del determinante de la matriz con AB y AC como sus filas.

xAB = b[0] - a[0] 
yAB = b[1] - a[1] 
xAC = c[0] - a[0] 
yAC = c[1] - a[1] 
detABxAC = (xAB * yAC) - (yAB * xAC) 
if (detABxAC < 0) 
    // sign is negative 
elif (detABxAC > 0) 
    // sign is positive 
else 
    // sign is 0, i.e. C is collinear with A, B 
+0

@tzaman: +1 a todos, gracias – SyntaxT3rr0r

+0

@Donal: no, ese es el caso para un producto de punto (que no es). @WizardOfOdds: De nada. Tenga en cuenta que si esto es lo que desea, no es realmente el producto de punto que busca, sino el signo de un componente del producto cruzado. – tzaman

+0

Leí mal lo que escribió y asumí que era una respuesta a la pregunta. Resultó que el interlocutor no conocía originalmente la diferencia entre los productos punto y cruzado, lo cual es algo importante, pero cuando leí la pregunta ya había sido corregida/aclarada. Todo fue solo una confusión. –

4

Suponiendo que si usted está preguntando si el ángulo entre AB y AC es agudo u obtuso, desea que esta:

int a[]= { 30, 20 }; 
int b[] = { 40, 50 }; 
int c[] = {12, 12}; 

int ab_x = b[0] - a[0]; 
int ab_y = b[1] - a[1]; 
int ac_x = c[0] - a[0]; 
int ac_x = c[1] - a[1]; 

int dot = ab_x*ac_x + ab_y*ac_y; 
boolean signABxAC = dot > 0; // pick your preferred comparison here 
Cuestiones relacionadas