2009-02-19 12 views
10

Escribo una aplicación de iPhone basada en OpenGL y me gustaría permitir que un usuario traduzca alrededor de una vista según la dirección en que muevan dos dedos en la pantalla. Por un dedo sé que podría simplemente calcular el vector desde la posición de inicio hasta la posición actual del dedo del usuario y luego encontrar el vector unitario de este para obtener solo la dirección, pero no sé cómo haría esto por dos dedos, no creo que agregar los componentes de los vectores y calcular el promedio funcionaría, así que estoy bastante atascado.Cómo calculo la dirección promedio de dos vectores

Respuesta

24

matemáticas vectoriales funciona igual que usted piensa:

v3 = (v1 + v2)/2 

// so: 
v3.x = (v1.x + v2.x)/2; 
// same for Y and Z 
3

agregarlos y dividiendo por dos Cómo funciona la

5

Fácil experimento mental: Hágalo por vectores unitarios en dirección X e Y. Intuitivamente, puede imaginarse que el "promedio" sería un vector unitario en un ángulo de 45 grados hacia arriba y hacia la derecha. Eso es exactamente lo que sucede. El experimento mental sugiere que necesita normalizar el promedio en su magnitud para obtener un vector unitario. Te aconsejo que lo hagas.

5

Si usted está interesado sólo en la dirección, debe añadirlos y normalizar el vector resultado,

(v1 + v2)/abs(v1 + v2) 
+8

División por cero! –

+0

let v1! = V2 ... – RickyA

+0

si solo está interesado en la dirección, las v1 y v2 se deben normalizar primero. – pikaille

7

Por lo general, es mejor para multiplicar de dividir por razones de velocidad cuando se hace la programación gráfica, así que recomiendo este :

v3 = (v1 + v2) * 0.5f;

+8

¿Esto no sería optimizado por el compilador, entonces '/ 2.0' es lo mismo que' * 0.5'? –

+0

Sí, debería, al menos según mi experiencia con compiladores típicos de C. Es otra historia si tienes una variable que es constante, digamos un ciclo más largo en el que divides algo por ella. Entonces puedo medir las diferencias si calcula una nueva variable (la inversa) y se multiplica en el ciclo. Sin embargo, la optimización de los compiladores mejora bastante rápidamente. – oli

3

Lo siento, pero esto es incorrecto. En el mundo de vectores, una "media" en el sentido de promediar componentes no significa nada. Imagine (-1 0) y (1 0) -> average = 0 0 ;-)

1

Para comprender de manera intuitiva, se puede dibujar los dos vectores hacia abajo. Luego dibuja un segmento de línea entre los puntos finales de los dos. El punto medio de este segmento es el vector promedio. Esto funciona para cualquier cantidad de dimensiones.

Cuestiones relacionadas