Pregunta

Estoy tratando de rotar un vector alrededor de un cierto punto en el vector (en C ++):

1 2 3
4 5 6
7 8 9

girado alrededor del punto (1,1) (que es el " 5 ") 90 grados daría como resultado:

7 4 1
8 5 2
9 6 3

Ahora mismo estoy usando:

x = (x * cos(90)) - (y * sin(90))
y = (y * cos(90)) + (x * sin(90))

Pero no quiero que gire alrededor (0,0)

¿Fue útil?

Solución

Como Mehrdad Afshari comentó en La publicación de Pesto , incluida la traducción al sistema de coordenadas original sería:

x_rotated = ((x - x_origin) * cos(angle)) - ((y_origin - y) * sin(angle)) + x_origin
y_rotated = ((y_origin - y) * cos(angle)) - ((x - x_origin) * sin(angle)) + y_origin

Otros consejos

La solución es traducir el vector a un sistema de coordenadas en el que el centro de rotación es (0,0). Aplique la matriz de rotación y traduzca el vector nuevamente al sistema de coordenadas original.

dx = x of rotation center  
dy = y of rotation center

V2 = V - [dx, dy, 0]  
V3 = V2 * rotation matrix  
Result = V3 + [dx, dy, 0]

Suponiendo que está utilizando una implementación vectorial estándar donde (0,0) sería la esquina superior izquierda y está girando alrededor del punto (x_origin, y_origin), esto debería hacerlo:

x = ((x - x_origin) * cos(angle)) - ((y_origin - y) * sin(angle))
y = ((y_origin - y) * cos(angle)) - ((x - x_origin) * sin(angle))

Tenga en cuenta que las y son y_origin - y porque el valor de y aumenta a medida que baja.

Deberá usar una matriz de traducción para mover la rotación alrededor de una punto diferente.

Descubrí que la respuesta de Marc Booth era incorrecta (rota (0,1,0) 0 grados y obtienes (0, -1,0) con su fórmula), y terminé con:

double cs = cos_deg(new_degrees);
double sn = sin_deg(new_degrees);

double translated_x = x - x_origin;
double translated_y = y - y_origin;

double result_x = translated_x * cs - translated_y * sn;
double result_y = translated_x * sn + translated_y * cs;

result_x += x_origin;
result_y += y_origin;

Esto puede simplificarse aún más, por supuesto, pero quiero hacerlo lo más simple posible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top