oscpacking-0.3.0.0: Graphics/OscPacking/Boundary.hs
{-|
Module : Graphics.OscPacking.Boundary
Description : Functions for bounding circle coverage
Copyright : (c) Christopher Howard, 2016
License : GPL-3
Maintainer : ch.howard@zoho.com
-}
module Graphics.OscPacking.Boundary where
import Graphics.OscPacking.Geometry
import Prelude ((/), (+), (/), (-), (>), ($), foldr, min, Maybe(..), (<), or, Float)
-- |A 'Boundary' is a function which takes a 'Point' and determines if
-- it is inside some area. If the Point is outside the area, it
-- returns 'Nothing'. Otherwise, it returns the distance to the edge
-- of the area. Any such 'Boundary' need not be a simple, traditional
-- geometric shape. Though, it is often difficult to calculate the
-- distance for more exotic shapes.
type Boundary = Point -> Maybe Float
-- |Provides a 'Boundary' for a circle of given origin and radius.
circleB
:: Point -- ^ origin
-> Float -- ^ radius
-> Boundary
circleB originP r testP =
if d > r then Nothing else Just (r - d) where d = euclidean originP testP
-- |Provides a 'Boundary' for a rectangle of given origin and dimensions
rectB :: Point -- ^ coordinate of the bottom left corner
-> Float -- ^ width
-> Float -- ^ height
-> Boundary
rectB (bLX, bLY) width height (tPX, tPY) =
if or [tPX < bLX,
tPX > bLX + width,
tPY < bLY,
tPY > bLY + height]
then Nothing
else Just $ foldr min (1/0)
[tPX - bLX,
bLX + width - tPX,
tPY - bLY,
bLY + height - tPY]