geomancy-0.4.0.0: test/Support/Reference/Linear.hs
module Support.Reference.Linear
( multiply
, conjugate
, rotate
) where
import Linear (Quaternion(..), V3, cross, dot, (*^))
multiply :: Num a => Quaternion a -> Quaternion a -> Quaternion a
multiply (Quaternion s1 v1) (Quaternion s2 v2) =
Quaternion (s1 * s2 - (v1 `dot` v2)) $
(v1 `cross` v2) + s1 *^ v2 + s2 *^ v1
conjugate :: Num a => Quaternion a -> Quaternion a
conjugate (Quaternion e v) = Quaternion e (negate v)
rotate :: Num a => Quaternion a -> V3 a -> V3 a
rotate q v = ijk
where
Quaternion _ ijk = q `multiply` Quaternion 0 v `multiply` conjugate q