{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}
-- |
-- Module : Data.Point2
-- Copyright : (c) Antony Courtney and Henrik Nilsson, Yale University, 2003
-- License : BSD-style (see the LICENSE file in the distribution)
--
-- Maintainer : ivan.perez@keera.co.uk
-- Stability : provisional
-- Portability : non-portable (GHC extensions)
--
-- 2D point abstraction (R^2).
module Data.Point2
( Point2(..) -- Non-abstract, instance of AffineSpace
, point2X -- :: RealFloat a => Point2 a -> a
, point2Y -- :: RealFloat a => Point2 a -> a
)
where
-- External imports
import Control.DeepSeq (NFData(..))
-- Internal imports
import Data.AffineSpace
import Data.Vector2
import Data.VectorSpace ()
-- * 2D point, constructors and selectors
-- | 2D point.
data Point2 a = RealFloat a => Point2 !a !a
deriving instance Eq a => Eq (Point2 a)
deriving instance Show a => Show (Point2 a)
instance NFData a => NFData (Point2 a) where
rnf (Point2 x y) = rnf x `seq` rnf y `seq` ()
-- | X coordinate of a 2D point.
point2X :: RealFloat a => Point2 a -> a
point2X (Point2 x _) = x
-- | Y coordinate of a 2D point.
point2Y :: RealFloat a => Point2 a -> a
point2Y (Point2 _ y) = y
-- * Affine space instance
instance RealFloat a => AffineSpace (Point2 a) (Vector2 a) a where
origin = Point2 0 0
(Point2 x y) .+^ v = Point2 (x + vector2X v) (y + vector2Y v)
(Point2 x y) .-^ v = Point2 (x - vector2X v) (y - vector2Y v)
(Point2 x1 y1) .-. (Point2 x2 y2) = vector2 (x1 - x2) (y1 - y2)