module Data.Geometry.Circle( Circle2'(..)
, Disc2'(..)
, IsCircleLike(..)
, inCircle
, insideCircle
, onCircle
, inDisc
, insideDisc
) where
import Data.Geometry.Point
import Data.Geometry.Geometry
data Circle2' a = Circle2 (Point2' a) a
deriving (Eq,Ord,Show,Read)
instance HasPoints Circle2' where
points (Circle2 p _) = [p]
newtype Disc2' a = Disc2 { border :: Circle2' a }
deriving (Show,Eq,Ord,Read)
instance HasPoints Disc2' where
points = points . border
class IsCircleLike t where
getCircle :: t a -> Circle2' a
getCircle x = Circle2 (center x) (radius x)
center :: t a -> Point2' a
center = center . getCircle
radius :: t a -> a
radius = radius . getCircle
distance :: Floating a => Point2' a -> t a -> a
distance p = distance p . getCircle
distanceToCenter :: Floating a => Point2' a -> t a -> a
distanceToCenter p = distanceToCenter p . getCircle
instance IsCircleLike Circle2' where
center (Circle2 p _) = p
radius (Circle2 _ r) = r
distanceToCenter p (Circle2 q _) = dist p q
distance p c@(Circle2 _ r) = distanceToCenter p c r
instance IsCircleLike Disc2' where
getCircle = border
inCircle :: (Ord a, Floating a) => Point2' a -> Circle2' a -> Bool
p `inCircle` c = distanceToCenter p c <= radius c
insideCircle :: (Floating a, Ord a) => Point2' a -> Circle2' a -> Bool
p `insideCircle` c = distanceToCenter p c < radius c
onCircle :: (Eq a, Floating a) => Point2' a -> Circle2' a -> Bool
p `onCircle` c = distanceToCenter p c == radius c
inDisc :: (Floating a, Ord a) => Point2' a -> Disc2' a -> Bool
p `inDisc` (Disc2 c) = p `inCircle` c
p `insideDisc` (Disc2 c) = p `insideCircle` c