HGamer3D-0.7.0: HGamer3D/Data/Angle.hs
{-
Datatypes to specify a geometric angle
HGamer3D Library (A project to enable 3D game development in Haskell)
Copyright 2011-2015 Peter Althainz
Distributed under the Apache License, Version 2.0
(See attached file LICENSE or copy at
http://www.apache.org/licenses/LICENSE-2.0)
file: HGamer3D/Data/Angle.hs
-}
-- | Angles as Degrees or Radians, based on Float datatype
module HGamer3D.Data.Angle
(
-- * Data definitions and conversions
Angle (..),
asRad,
asDeg,
-- * Mathematical functions
addA,
subA,
mulA,
divA,
sinA,
cosA,
tanA,
asinA,
acosA,
atanA,
)
where
import Data.MessagePack
import Fresco
-- | construct an Angle either by giving it in degrees or radians
data Angle = Rad Float | Deg Float deriving (Eq, Ord, Show)
-- | value of an Angle as radiant
asRad :: Angle -> Float
asRad (Rad f) = f
asRad (Deg d) = d/180*pi
-- | value of an Angle as degree
asDeg :: Angle -> Float
asDeg (Deg f) = f
asDeg (Rad d) = d/pi*180
sinA :: Angle -> Float
sinA = sin . asRad
cosA :: Angle -> Float
cosA = cos . asRad
tanA :: Angle -> Float
tanA = tan . asRad
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 $ (asRad a) + (asRad b)
subA :: Angle -> Angle -> Angle
subA a b = Rad $ (asRad a) - (asRad b)
mulA :: Angle -> Float -> Angle
mulA a b = Rad $ (asRad a) * b
divA :: Angle -> Float -> Angle
divA a b = Rad $ (asRad a) / b
instance ComponentClass Angle where
toObj (Rad v1) = ObjectArray [ObjectInt 0, ObjectArray [ObjectFloat v1]]
toObj (Deg v1) = ObjectArray [ObjectInt 1, ObjectArray [ObjectFloat v1]]
fromObj (ObjectArray [ObjectInt 0, ObjectArray [ObjectFloat v1]]) = Rad v1
fromObj (ObjectArray [ObjectInt 1, ObjectArray [ObjectFloat v1]]) = Deg v1