packages feed

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