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;

segunda-feira, 5 de julho de 2021

Deduzindo as propriedades básicas dos logaritmos

Dado que e^ln(x) = x, (por definição), temos que,

ab = ab; e^ln(ab) = e^ln(a)*e^ln(b) = e^(ln(a)+ln(b))
Logo, ln(ab) = ln(a)+ln(b)

a/b = a/b; e^ln(a/b) = e^ln(a)/e^ln(b) = e^(ln(a)-ln(b))
Logo, ln(a/b) = ln(a)-ln(b)

a^b = a^b; e^ln(a^b) = (e^ln(a))^b = e^(b*ln(a))
Logo, ln(a^b) = b*ln(a)

ln(a)/ln(b) = z; ln(a) = z*ln(b) = ln(b^z); a=b^z; log_b(a) = z
Logo, ln(a)/ln(b) = log_b(a)

Seria trivial extender esses resultados para todas as bases, usando c^log_c no lugar de e^ln em todos os passos...