2011-07-14 17 views
9

Hola, estoy tratando de averiguar cómo calcular el inverso de un cuaternión. Un ejemplo de código sería increíble.Calcular Quaternion inversa

Saludos

+1

@TabbyCool ¿Cómo "intentaría" algo? ¿Esperas que literalmente obtenga un bolígrafo y un bloc de notas y redescubra una pieza matemática que la humanidad tardó cientos de años en descifrar? – MaiaVictor

Respuesta

8

Ver Wikipedia article para toda la matemática Quaternion.

No sé qué idioma quieres usar, pero intentaré dar algunos consejos en Haskell.

data Quaternion = Q Double Double Double Double deriving (Show, Eq) 

En primer lugar, debe implementar la multiplicación y la adición de cuaterniones.

instance Num Quaternion where 
(+) = q_plus 
(*) = q_mult 
--.... 

q_plus (Q a b c d) (Q a' b' c' d') = Q (a + a') (b + b') (c + c') (d + d') 
q_mult (Q a b c d) (Q a' b' c' d') = Q a'' b'' c'' d'' 
    where 
    a'' = a * a' - b * b' - c * c' - d * d' 
    b'' = a * b' + b * a' + c * d' - d * c' 
    c'' = a * c' - b * d' + c * a' + d * b' 
    d'' = a * d' + b * c' - c * b' + d * a' 

Multiplicación con escalar debe hacerse a través de una conversión:

scalar_to_q a = Q a 0 0 0 

Definir

i = Q 0 1 0 0 
j = Q 0 0 1 0 
k = Q 0 0 0 1 

luego implementar el conjugado y el módulo:

q_conjugate q = (scalar_to_q (negate .5)) * (q + i * q * i + j * q * j + k * q * k) 
q_modulus q = sqrt $ q * (q_conjugate q) 

Ahora, la inversa :

q_inverse q = (q_conjugate q) * (scalar_to_q (m * m)) 
    where 
    m = q_modulus q 

Espero que sea útil.

PD: la definición de instancia anterior simplificará un poco las cosas si se completa con éxito. Te dejo completar los huecos.

+0

Gracias. ¡Respuesta impresionante! – user346443

+10

¿Por qué se cierra esta pregunta ?, es una pregunta legítima que pregunta cómo calcular un inverso de un cuaternión. ¿StackOverflow no se está moderando demasiado? – kaalus