module HGamer3D.Data.Angle
(
Angle (..),
asRad,
asDeg,
addA,
subA,
mulA,
divA,
sinA,
cosA,
tanA,
asinA,
acosA,
atanA,
)
where
import Fresco
import Data.Binary.Serialise.CBOR
import Data.Binary.Serialise.CBOR.Encoding
import Data.Binary.Serialise.CBOR.Decoding
import Data.Text
import Data.Monoid
import Control.Applicative
data Angle = Rad Float
| Deg Float
deriving (Eq, Read, Show)
instance Serialise Angle where
encode (Rad v1) = encodeListLen 2 <> encode (0::Int) <> encode v1
encode (Deg v1) = encodeListLen 2 <> encode (1::Int) <> encode v1
decode = do
decodeListLen
i <- decode :: Decoder s Int
case i of
0 -> (Rad <$> decode)
1 -> (Deg <$> decode)
asRad :: Angle -> Float
asRad (Rad f) = f
asRad (Deg d) = d/180*pi
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