packages feed

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