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