module Data.Geometry.Polygon where
import Data.Geometry.BoundingBox
import Data.Geometry.Point
import Data.Geometry.Geometry
class (HasPoints p, IsTransformable p) => IsPolygon p where
vertices :: p a -> [Point2' a]
vertices = points
edges :: p a -> [(Point2' a, Point2' a)]
edges p = let pts = points p in
zip pts (tail pts ++ [head pts])
isSimple :: p a -> Bool
containsHoles :: p a -> Bool
data SimplePolygon' a = SimplePolygon [Point2' a]
deriving (Show,Eq)
instance HasPoints SimplePolygon' where
points (SimplePolygon pts) = pts
instance IsPolygon SimplePolygon' where
isSimple = const True
containsHoles = const False
instance IsPoint2Functor SimplePolygon' where
p2fmap f (SimplePolygon pts) = SimplePolygon (map f pts)
data MultiPolygon' a = MultiPolygon [SimplePolygon' a]
deriving (Show,Eq)
instance HasPoints MultiPolygon' where
points (MultiPolygon pls) = concatMap points pls
instance IsPolygon MultiPolygon' where
isSimple = const False
containsHoles = const False
instance IsPoint2Functor MultiPolygon' where
p2fmap f (MultiPolygon polys) = MultiPolygon (map (p2fmap f) polys)
instance IsPolygon BoundingBox2' where
isSimple = const True
containsHoles = const False