gloss-rendering-1.9.1.1: Graphics/Gloss/Data/Point.hs
{-# OPTIONS -fno-warn-missing-methods -fno-warn-orphans #-}
{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
module Graphics.Gloss.Data.Point
( Point
, pointInBox)
where
-- | A point on the x-y plane.
-- Points can also be treated as `Vector`s, so "Graphics.Gloss.Data.Vector"
-- may also be useful.
type Point = (Float, Float)
-- | Pretend a point is a number.
-- Vectors aren't real numbes according to Haskell, because they don't
-- support the multiply and divide field operators. We can pretend they
-- are though, and use the (+) and (-) operators as component-wise
-- addition and subtraction.
--
instance Num Point where
(+) (x1, y1) (x2, y2) = (x1 + x2, y1 + y2)
(-) (x1, y1) (x2, y2) = (x1 - x2, y1 - y2)
(*) (x1, y1) (x2, y2) = (x1 * x2, y1 * y2)
signum (x, y) = (signum x, signum y)
abs (x, y) = (abs x, abs y)
negate (x, y) = (negate x, negate y)
fromInteger x = (fromInteger x, fromInteger x)
-- | Test whether a point lies within a rectangular box that is oriented
-- on the x-y plane. The points P1-P2 are opposing points of the box,
-- but need not be in a particular order.
--
-- @
-- P2 +-------+
-- | |
-- | + P0 |
-- | |
-- +-------+ P1
-- @
--
pointInBox
:: Point
-> Point
-> Point -> Bool
pointInBox (x0, y0) (x1, y1) (x2, y2)
= x0 >= min x1 x2
&& x0 <= max x1 x2
&& y0 >= min y1 y2
&& y0 <= max y1 y2