hgeometry-0.4.0.0: src/Data/Geometry/PolyLine.hs
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE DeriveFunctor #-}
module Data.Geometry.PolyLine where
import Control.Applicative
import Control.Lens
import Data.Ext
import qualified Data.Foldable as F
import Data.Geometry.Box
import Data.Geometry.Interval
import Data.Geometry.Point
import Data.Geometry.Properties
import Data.Geometry.Transformation
import Data.Geometry.Vector
import qualified Data.Seq2 as S2
import Data.Semigroup
--------------------------------------------------------------------------------
-- * d-dimensional Polygonal Lines (PolyLines)
-- | A Poly line in R^d
newtype PolyLine d p r = PolyLine { _points :: S2.Seq2 (Point d r :+ p) }
makeLenses ''PolyLine
deriving instance (Show r, Show p, Arity d) => Show (PolyLine d p r)
deriving instance (Eq r, Eq p, Arity d) => Eq (PolyLine d p r)
deriving instance (Ord r, Ord p, Arity d) => Ord (PolyLine d p r)
deriving instance Arity d => Functor (PolyLine d p)
type instance Dimension (PolyLine d p r) = d
type instance NumType (PolyLine d p r) = r
instance Semigroup (PolyLine d p r) where
(PolyLine pts) <> (PolyLine pts') = PolyLine $ pts <> pts'
instance Arity d => IsBoxable (PolyLine d p r) where
boundingBox = boundingBoxList . toListOf (points.traverse.core)
instance (Num r, AlwaysTruePFT d) => IsTransformable (PolyLine d p r) where
transformBy = transformPointFunctor
instance PointFunctor (PolyLine d p) where
pmap f = over points (fmap (fmap f))
-- | pre: The input list contains at least two points
fromPoints :: (Monoid p) => [Point d r] -> PolyLine d p r
fromPoints = PolyLine . S2.fromList . map (\p -> p :+ mempty)