C ++: Rotação um vector em torno de um certo ponto

votos
15

Eu estou tentando rodar um vetor em torno de um certo ponto no vector (em C ++):

1 2 3
4 5 6
7 8 9

rodados em torno do ponto (1,1) (que é a 5) de 90 graus resultaria em:

7 4 1
8 5 2
9 6 3

Agora eu estou usando:

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

Mas eu não quero que girado em torno de (0,0)

Publicado 06/03/2009 em 23:44
fonte usuário
Em outras línguas...                            


5 respostas

votos
11

A solução é para traduzir o vector a um sistema de coordenadas, no qual o centro de rotação é (0,0). Aplicar a matriz de rotação e traduzir o vetor de volta para o 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]
Respondeu 06/03/2009 em 23:47
fonte usuário

votos
1

Você vai precisar usar uma matriz de translação para mover girar sobre um ponto diferente.

Respondeu 06/03/2009 em 23:49
fonte usuário

votos
4

Supondo que você estiver usando uma implementação vector padrão onde (0,0) seria o canto superior esquerdo e você está girando em torno do ponto (x_origin, y_origin), este deve fazê-lo:

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

Note que a y de são y_origin - yporque os y valor aumenta à medida que você descer.

Respondeu 06/03/2009 em 23:51
fonte usuário

votos
27

Como Mehrdad Afshari comentou sobre Pesto post 's, incluindo a tradução de volta para o sistema de coordenadas original seria:

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
Respondeu 01/04/2009 em 14:26
fonte usuário

votos
1

Eu encontrei a resposta de Marc Booth estar errado (girar (0,1,0) por 0 graus e você começa (0, -1,0) com sua fórmula), e acabei com:

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;

Isso pode ser ainda mais simplificada, é claro, mas eu quero fazê-lo o mais simples possível.

Respondeu 16/03/2015 em 11:40
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more