lin-alg-0.1.0.0: src/Numeric/LinearAlgebra/OrthoNormalBasis.hs
module Numeric.LinearAlgebra.OrthoNormalBasis where
import Numeric.LinearAlgebra.Vector
epsilon :: (Ord a, Floating a) => a
epsilon = 0.01
data ONB a = ONB
{ onbU :: Vec3 a
, onbV :: Vec3 a
, onbW :: Vec3 a
} deriving (Read, Show, Eq, Ord)
mkFromU :: (Ord a, Floating a) => Vec3 a -> ONB a
mkFromU u' = ONB u v w
where
n = Vec3 1 0 0
m = Vec3 0 1 0
u = unitVector u'
v = if len (u <%> n) < epsilon
then u <%> m
else u <%> n
w = u <%> v
mkFromV :: (Ord a, Floating a) => Vec3 a -> ONB a
mkFromV v' = ONB u v w
where
n = Vec3 1 0 0
m = Vec3 0 1 0
v = unitVector v'
u = if lenSquared (v <%> n) < epsilon
then v <%> m
else v <%> n
w = u <%> v
mkFromW :: (Ord a, Floating a) => Vec3 a -> ONB a
mkFromW w' = ONB u v w
where
n = Vec3 1 0 0
m = Vec3 0 1 0
w = unitVector w'
u = if len (w <%> n) < epsilon
then w <%> m
else w <%> n
v = w <%> u
mkFromUV :: Floating a => Vec3 a -> Vec3 a -> ONB a
mkFromUV u' v' = ONB u v w
where
u = unitVector u'
w = unitVector (u' <%> v')
v = w <%> u
mkFromVU :: Floating a => Vec3 a -> Vec3 a -> ONB a
mkFromVU v' u' = ONB u v w
where
v = unitVector v'
w = unitVector (u' <%> v')
u = v <%> w
mkFromUW :: Floating a => Vec3 a -> Vec3 a -> ONB a
mkFromUW u' w' = ONB u v w
where
u = unitVector u'
v = unitVector (w' <%> u')
w = u <%> v
mkFromWU :: Floating a => Vec3 a -> Vec3 a -> ONB a
mkFromWU w' u' = ONB u v w
where
w = unitVector w'
v = unitVector (w' <%> u')
u = v <%> w
mkFromVW :: Floating a => Vec3 a -> Vec3 a -> ONB a
mkFromVW v' w' = ONB u v w
where
v = unitVector v'
u = unitVector (v' <%> w')
w = u <%> v
mkFromWV :: Floating a => Vec3 a -> Vec3 a -> ONB a
mkFromWV w' v' = ONB u v w
where
w = unitVector w'
u = unitVector (v' <%> w')
v = w <%> u