bogre-banana-0.0.1: src/BB/Util/Vec.hs
module BB.Util.Vec (
Vec3,
scale,
add,
sub,
to,
dot,
norm,
dist,
sqrNorm,
sqrDist,
unit,
vecSum
) where
type Vec3 = (Float, Float, Float)
-- helper
apply :: (Float -> Float) -> Vec3 -> Vec3
apply fn (x,y,z) = (fn x, fn y, fn z)
impose :: (Float -> Float -> Float) -> Vec3 -> Vec3 -> Vec3
impose fn (x1,y1,z1) (x2,y2,z2) = (fn x1 x2, fn y1 y2, fn z1 z2)
sum3 :: Vec3 -> Float
sum3 (a,b,c) = sum [a,b,c]
zero :: Vec3
zero = (0,0,0)
-- exported
scale :: Float -> Vec3 -> Vec3
scale s = apply (*s)
add :: Vec3 -> Vec3 -> Vec3
add = impose (+)
vecSum :: [Vec3] -> Vec3
vecSum = foldr add zero
to :: Vec3 -> Vec3 -> Vec3
to a b = impose (-) b a
sub :: Vec3 -> Vec3 -> Vec3
sub = flip to
dot :: Vec3 -> Vec3 -> Float
dot a b = sum3 (impose (*) a b)
sqrDist :: Vec3 -> Vec3 -> Float
sqrDist a b = sqrNorm (a `to` b)
dist :: Vec3 -> Vec3 -> Float
dist a b = sqrt (sqrDist a b)
sqrNorm :: Vec3 -> Float
sqrNorm v = v `dot` v
norm :: Vec3 -> Float
norm = sqrt . sqrNorm
unit :: Vec3 -> Vec3
unit v = scale (1/(norm v)) v