c++ - Rotaciones 2D del vector euclidiano
math rotation (5)
Tengo un vector euclidiano sentado en las coordenadas (0, 1)
. Quiero rotar a
90 grados (en el sentido de las agujas del reloj) alrededor del origen: (0, 0)
.
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 el sentido de las agujas del reloj), 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;
Usando el código anterior, con un valor de angle
de 90.0 grados, las coordenadas resultantes son: (-1, 1)
. Y estoy tan malditamente confundido. Los ejemplos que se ven en los siguientes enlaces representan la misma fórmula que se muestra arriba seguramente?
¿Qué he hecho mal? ¿O he entendido mal cómo se va a rotar un vector?
Está calculando la parte y de su nueva coordenada en función de la ''nueva'' x-parte de la nueva coordenada. Básicamente, esto significa que calcula la nueva producción en términos de la nueva salida ...
Intente reescribir 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 puedes hacer esto:
vector2<double> input(0,1);
vector2<double> transformed = multiply( input, cs, sn );
¡Tenga en cuenta que la elección de nombres propios para sus variables puede evitar este problema por completo!
Girar 90 grados alrededor de 0,0:
x'' = -y
y'' = x
Girar 90 grados alrededor de px, py:
x'' = -(y - py) + px
y'' = (x - px) + py
Girar un vector 90 grados es particularmente simple.
(x, y)
gira 90 grados alrededor (0, 0)
es (-y, x)
.
Si quieres rotar en sentido horario, simplemente hazlo al revés, obteniendo (y, -x)
.
Suena más fácil de hacer 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;
La rotación de vectores es un subconjunto de la multiplicación compleja.
debes eliminar 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 llegar a la segunda línea:
px = x * cs - y * sn;
py = x * sn + y * cs;