module Support.Reference.Vec3 ( dot , cross , normalize ) where import Linear (V3(..)) import Linear.Epsilon (Epsilon(..)) dot :: Num a => V3 a -> V3 a -> a dot (V3 a b c) (V3 d e f) = a * d + b * e + c * f cross :: Num a => V3 a -> V3 a -> V3 a cross (V3 a b c) (V3 d e f) = V3 (b * f - c * e) (c * d - a * f) (a * e - b * d) normalize :: (Floating a, Epsilon a) => V3 a -> V3 a normalize v = if nearZero q || nearZero (1 - q) then v else fmap (/ l) v where q = dot v v l = sqrt q