module Art.Geometry where
import Data.Biapplicative
type Vec = (Float, Float)
both :: (a -> b) -> (a, a) -> (b, b)
both f (a, b) = (f a, f b)
addVecs :: Vec -> Vec -> Vec
addVecs = biliftA2 (+) (+)
reflectVec :: Vec -> Vec
reflectVec = both negate
subVecs :: Vec -> Vec -> Vec
subVecs v1 v2 = addVecs v1 $ reflectVec v2
scaleVec :: Float -> Vec -> Vec
scaleVec n = both (* n)
radDegRatio :: Float
radDegRatio = pi / 180
degToRad :: Float -> Float
degToRad = (* radDegRatio)
rotateZero :: Float -> Vec -> Vec
rotateZero amtd (x, y)
= (x * cos amt - y * sin amt, y * cos amt + x * sin amt)
where
amt = degToRad amtd