domingo, 11 de julho de 2021

Como girar um vetor dado θ (rad) em torno de um vetor arbitrário?

Fazemos uma pequena mudança de base...

Dados: v_dado, v_eixoθ.
Primeiro normalizamos v_eixo e projetamos v_dado no plano ortogonal a v_eixo que passa pela origem.
v_eixo <- v_eixo/|v_eixo|
h <- <v_eixo,v_dado>
h <- h v_eixo
v_x <- v_dado - h
r <- |v_x|
v_x <- v_x/r
(Negrito aqui representa vetores tridimensionais. Quando não há negrito falamos do módulo ou magnitude.)

Nesse caso, projetar foi apenas remover a "altura": h = v_dado cos(α); α=(v_dado,v_eixo).
h = h veixo

Agora, na nossa mudança de base, v_z toma o valor de v_eixo, e v_y será o produto vetorial entre os dois, na ordem correta (regra da mão direita):
v_z <- v_eixo
v_y <- v_z × v_x

Como v_z e v_x são ortogonais, e ambos de norma 1, v_y também terá norma 1.
Agora giramos:
v_x <- v_x cos θ;
v_y <- v_y sin θ;
v_res <- r(v_x + v_y) + h;

E está aí, o vetor resultado. Para girar em torno de um ponto qualquer, é só subtrair esse ponto, girar em torno da origem (que é o que fizemos), e então somar o ponto.

Em resumo, e simplificando alguns passos, o algoritmo fica:

v_eixo <- v_eixo/|v_eixo|;
h <- <v_eixo, v_dado> v_eixo;
v_x <- v_dado - h;
v_y <- v_eixo × v_x;
v_res <- v_x cos θ + v_y sin θ + h;
return v_res;

Nenhum comentário:

Postar um comentário