{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE BangPatterns #-}
module Graphics.WorldTurtle.Internal.Coords
  ( module GPoint
  , module GArithmetic
  , module GVector
  , module GAngle
  , lerp
  , normalizeHeading
  , normalizeDirection
  ) 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

lerp :: Float -> Point -> Point -> Point
lerp :: Float -> Point -> Point -> Point
lerp !Float
l !Point
a !Point
b =  ((Float
1 Float -> Float -> Float
forall a. Num a => a -> a -> a
P.- Float
l) Float -> Point -> Point
`mulSV` Point
a) Point -> Point -> Point
+ (Float
l Float -> Point -> Point
`mulSV` Point
b)

-- | Return a valid heading value between (0, 360).

normalizeHeading :: Float -> Float
normalizeHeading :: Float -> Float
normalizeHeading !Float
f
  | Float
f Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
< Float
0     = Float -> Float
normalizeHeading (Float
f Float -> Float -> Float
forall a. Num a => a -> a -> a
P.+ Float
r)
  | Float
f Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
> Float
r     = Float -> Float
normalizeHeading (Float
f Float -> Float -> Float
forall a. Num a => a -> a -> a
P.- Float
r)
  | Bool
otherwise = Float
f
  where r :: Float
r = Float
360.0

-- | Return a valid heading value between (-180, 180).

normalizeDirection :: Float -> Float
normalizeDirection :: Float -> Float
normalizeDirection !Float
f
  | Float
f Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
< -Float
r     = Float -> Float
normalizeHeading (Float
f Float -> Float -> Float
forall a. Num a => a -> a -> a
P.+ Float
r)
  | Float
f Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
>  Float
r     = Float -> Float
normalizeHeading (Float
f Float -> Float -> Float
forall a. Num a => a -> a -> a
P.- Float
r)
  | Bool
otherwise = Float
f
  where r :: Float
r = Float
180.0