{-#  OPTIONS_HADDOCK hide #-}

{-# LANGUAGE NoImplicitPrelude #-}


module Imj.Geo.Continuous.Conversion
           ( -- * Conversion to / from discrete coordinates
{- | Discrete positions are converted to continuous positions by
placing them at the "pixel center", ie by applying an offset of (0.5, 0.5) in
'pos2vec'.

Then, during the inverse transformation - in 'vec2pos', coordinates are just
floored.

Discrete speeds are converted with 'speed2vec'. The half-pixel convention is not
applied for speeds. The inverse conversion is 'vec2speed'.
-}
             pos2vec
           , vec2pos
           , speed2vec
           , vec2speed
           ) where

import           Imj.Prelude

import           Imj.Geo.Continuous.Types
import           Imj.Geo.Discrete.Types

-- | Convert a discrete position to a continuous position.
pos2vec :: Coords Pos -> Vec2 Pos
pos2vec (Coords r c) =
  Vec2 (0.5 + fromIntegral c) (0.5 + fromIntegral r)

-- | Convert a continuous position to a discrete position.
vec2pos :: Vec2 Pos -> Coords Pos
vec2pos (Vec2 x y) =
  Coords (floor y) (floor x)

-- | Convert a discrete speed to a continuous speed.
speed2vec :: Coords Vel -> Vec2 Vel
speed2vec (Coords r c) =
  Vec2 (fromIntegral c) (fromIntegral r)

-- | Convert a continuous speed to a discrete speed.
vec2speed :: Vec2 Vel -> Coords Vel
vec2speed (Vec2 x y) =
  Coords (fromIntegral (round y :: Int)) (fromIntegral (round x :: Int))