packages feed

worldturtle-0.2.2.0: Graphics/WorldTurtle/Internal/Coords.hs

{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE BangPatterns #-}
module Graphics.WorldTurtle.Internal.Coords
  ( module GPoint
  , module GArithmetic
  , module GVector
  , module GAngle
  , lerp
  , normalizeHeading
  ) where

import Prelude hiding ((-), (+))
import qualified Prelude as P

import Graphics.Gloss.Data.Point as GPoint
import Graphics.Gloss.Data.Point.Arithmetic as GArithmetic
import Graphics.Gloss.Data.Vector as GVector
import Graphics.Gloss.Geometry.Angle as GAngle

-- | What it says on the tin. A lerp function. 
lerp :: Float -- Coefficient between 0 and 1.
     -> Point -- Point /a/.
     -> Point -- Point /b/.
     -> Point -- new point some percentage value between /a/ and /b/.
lerp !l !a !b = let (!ux, !uy) = (1 P.- l) `mulSV` a
                    (!vx, !vy) = l `mulSV` b
                    !n = (ux P.+ vx, uy P.+ vy)
               in n

-- | Return a valid heading value between (0, 360].
--   We want 360 to be 360 (full rotation).
--   We want 361 to be 1 (wraparound rotation).
--   Special case: we want 0 to be 0 (no rotation). Though really 0 is equal to
--   360 we will let this special case slide as it helps in our time elapsed 
--   calculations.
normalizeHeading :: Float -> Float
normalizeHeading 0 = 0
normalizeHeading f = let (n, b) = properFraction f :: (Int, Float)
                         f' = fromIntegral (n `rem` 360) P.+ b
                      in if f' <= 0 then f' P.+ 360 else f'