module HGamer3D.Data.Angle
(
Angle (..),
Radians (..),
Degrees (..),
fromAngle,
addA,
subA,
mulA,
divA,
sinA,
cosA,
tanA,
asinA,
acosA,
atanA,
)
where
data Angle = Rad Float | Deg Float deriving (Eq, Ord, Show)
sinA :: Angle -> Float
sinA = sin . fromAngle
cosA :: Angle -> Float
cosA = cos . fromAngle
tanA :: Angle -> Float
tanA = tan . fromAngle
asinA :: Float -> Angle
asinA = Rad . asin
acosA :: Float -> Angle
acosA = Rad . acos
atanA :: Float -> Angle
atanA = Rad . atan
addA :: Angle -> Angle -> Angle
addA a b = Rad $ (fromAngle a) + (fromAngle b)
subA :: Angle -> Angle -> Angle
subA a b = Rad $ (fromAngle a) (fromAngle b)
mulA :: Angle -> Float -> Angle
mulA a b = Rad $ (fromAngle a) * b
divA :: Angle -> Float -> Angle
divA a b = Rad $ (fromAngle a) / b
data Radians = Radians Float deriving (Eq, Ord, Show)
data Degrees = Degrees Float deriving (Eq, Ord, Show)
class Angles a where
toAngle :: a -> Angle
fromAngle :: Angle -> a
instance Angles Float where
toAngle r = Rad r
fromAngle (Rad r) = r
fromAngle (Deg d) = d/180*pi
instance Angles Radians where
toAngle (Radians r) = Rad r
fromAngle (Rad r) = (Radians r)
fromAngle (Deg d) = (Radians (d/180*pi))
instance Angles Degrees where
toAngle (Degrees d) = Deg d
fromAngle (Deg d) = (Degrees d)
fromAngle (Rad r) = (Degrees (r/pi*180))