module Data.Measure.Angle(AngleMeasure,
rad,
radians,
degrees,
mils,
arcminutes,
arcseconds,
grads,
octants,
quadrants,
sextants,
signs,
Angle,
rad',
angle) where
import Data.Measure.RelativeDouble
import Data.Measure.ConvertDouble
newtype AngleMeasure = Radian {
rad :: Double
} deriving (Eq, Ord, Enum, Num, Fractional, Floating)
instance Show AngleMeasure where
show = show . rad
radians :: AngleMeasure
radians = Radian 1
degrees :: AngleMeasure
degrees = radians .*. pi / 180
mils :: AngleMeasure
mils = radians .*. pi / 3200
arcminutes :: AngleMeasure
arcminutes = degrees ./. 60
arcseconds :: AngleMeasure
arcseconds = arcminutes ./. 60
grads :: AngleMeasure
grads = radians .*. pi / 200
octants :: AngleMeasure
octants = degrees .*. 45
quadrants :: AngleMeasure
quadrants = octants .*. 2
sextants :: AngleMeasure
sextants = degrees .*. 60
signs :: AngleMeasure
signs = degrees .*. 30
newtype Angle = Angle {
rad' :: Double
} deriving (Eq, Ord, Enum, Num, Fractional, Floating)
angle :: Double -> Angle
angle = Angle
instance Show Angle where
show (Angle d) = show d ++ "rad"
instance RelativeDouble AngleMeasure where
Radian n .*. r = Radian (n * r)
Radian n ./. r = Radian (n / r)
instance ConvertDouble AngleMeasure Angle where
x ..> n = Angle (x * rad n)
n <.. x = rad' n / rad x