{-# 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))