2011-01-24 14 views
39

Tengo un vector euclidiano a sentado en las coordenadas (0, 1). Quiero rotar a por 90 grados (en sentido horario) alrededor del origen: (0, 0).rotaciones 2D vectoriales euclidianas

Si tengo una comprensión adecuada de cómo debería funcionar esto, las coordenadas resultantes (x, y) después de la rotación deberían ser (1, 0). Si tuviera que girarlo 45 grados (aún en sentido horario), habría esperado que las coordenadas resultantes fueran (0.707, 0.707).

theta = deg2rad(angle); 

cs = cos(theta); 
sn = sin(theta); 

x = x * cs - y * sn; 
y = x * sn + y * cs; 

Utilizando el código de seguridad, con un valor angle de 90,0 grados, las coordenadas resultantes son: (-1, 1). Y estoy tan malditamente confundido. Los ejemplos que se muestran en los siguientes enlaces representan seguramente la misma fórmula que se muestra arriba?

¿Qué he hecho mal? ¿O he entendido mal cómo se va a girar un vector?

+0

¿Cuáles son los tipos de todas las variables? –

+0

dobla, pero la respuesta fue bastante simple, gracias a Caspar. – dcousens

+0

Además, ¿no es esto en sentido antihorario? –

Respuesta

63

debe quitar los VARs de la función:

x = x * cs - y * sn; // now x is something different than original vector x 
y = x * sn + y * cs; 

crear nuevas coordenadas se convierte, para evitar el cálculo de x antes de que llegue la segunda línea:

px = x * cs - y * sn; 
py = x * sn + y * cs; 
+3

Oh dios, necesitaba ojos frescos ... de nuevo algo tan obvio ... Gracias amigo (funciona una belleza, 2 horas después ... jaja) – dcousens

+0

cuando ejecutas x = x * cs - y * sn ;, da un valor diferente a x en y = x * sn + y * cs, por lo que la x "descarrilará" –

+2

@Daniel: La x en la segunda declaración tuvo su valor cambiado en el momento en que la usó para calcular el valor de y . Entonces, esencialmente, calculó la coordenada x para rotar (0,1) (que es -1). Luego almacenaste esto en la coordenada x dando (-1,1) y luego calculabas la coordenada y para rotar (-1,1) (que en realidad debería ser -1, así que no estoy seguro de cómo conseguiste (-1 , 1) en lugar de (-1, -1)). La respuesta correcta, por cierto, no es (1,0), es (-1,0) ya que la rotación por ángulos positivos es en sentido antihorario cuando se ve desde arriba. –

68

Rotación de un vector de 90 grados es Particularmente simple.

(x, y) girado 90 grados alrededor de (0, 0) es (-y, x).

Si desea girar en el sentido de las agujas del reloj, simplemente hágalo al revés, obteniendo (y, -x).

+14

+1. Para cualquiera que gire un vector 2D para una pantalla de computadora: esta respuesta supone que el eje y está apuntando hacia arriba como en matemáticas. Si está apuntando hacia abajo como en las pantallas de la computadora, se invierten las agujas del reloj y las agujas del reloj. '(-y, x)' es en el sentido de las agujas del reloj y '(y, -x)' es en sentido antihorario. –

5

Está calculando la parte y de su nueva coordenada basada en la 'nueva' x-parte de la nueva coordenada. Básicamente esto significa que su cálculo de la nueva producción en términos de la nueva salida ...

Trate de volver a escribir en términos de entrada y salida:

vector2<double> multiply(vector2<double> input, double cs, double sn) { 
    vector2<double> result; 
    result.x = input.x * cs - input.y * sn; 
    result.y = input.x * sn + input.y * cs; 
    return result; 
} 

entonces usted puede hacer esto:

vector2<double> input(0,1); 
vector2<double> transformed = multiply(input, cs, sn); 

¡Observe cómo elegir nombres propios para sus variables puede evitar este problema completamente!

5

suena más fácil que ver con las clases estándar:

std::complex<double> vecA(0,1); 
std::complex<double> i(0,1); // 90 degrees 
std::complex<double> r45(sqrt(2.0),sqrt(2.0)); 
vecA *= i; 
vecA *= r45; 

rotación vectorial es un subconjunto de la multiplicación compleja ..

+0

tenga en cuenta que este método no necesita calcular senos o cosenos – jeffythedragonslayer

+1

TBH porque 'r45' es precalculado. – MSalters

17

la gira 90 Degress alrededor de 0,0:

x' = -y 
y' = x 

Girar 90 grados alrededor de px, py:

x' = -(y - py) + px 
y' = (x - px) + py 
Cuestiones relacionadas