{-# LANGUAGE BangPatterns #-}
module Vec2 where
data Vec2
= Vec2 {-# UNPACK #-}!Double {-# UNPACK #-}!Double
deriving Show
vecZero :: Vec2
vecZero = Vec2 0.0 0.0
vecAdd :: Vec2 -> Vec2 -> Vec2
vecAdd (Vec2 a b) (Vec2 x y)
= Vec2 (a+x) (b+y)
vecSub :: Vec2 -> Vec2 -> Vec2
vecSub (Vec2 a b) (Vec2 x y)
= Vec2 (a-x) (b-y)
vecScale :: Vec2 -> Double -> Vec2
vecScale (Vec2 a b) !s
= Vec2 (a*s) (b*s)
vecDot :: Vec2 -> Vec2 -> Double
vecDot (Vec2 a b) (Vec2 x y)
= (a*x)+(b*y)
vecNorm :: Vec2 -> Double
vecNorm v
= sqrt (vecDot v v)
vecNormalize :: Vec2 -> Vec2
vecNormalize v
= vecScale v (1.0 / (vecNorm v))
vecDimSelect :: Vec2 -> Int -> Double
vecDimSelect (Vec2 a b) n
= case rem n 2 of
0 -> a
1 -> b
vecLessThan :: Vec2 -> Vec2 -> Bool
vecLessThan (Vec2 a b) (Vec2 x y)
= a < x && b < y
vecGreaterThan :: Vec2 -> Vec2 -> Bool
vecGreaterThan (Vec2 a b) (Vec2 x y)
= a > x && b > y