Copyright | (C) Frank Staals |
---|---|
License | see the LICENSE file |
Maintainer | Frank Staals |
Safe Haskell | None |
Language | GHC2021 |
Line segment intersections in \(O(n^2)\) by checking all pairs.
Synopsis
- intersections :: (Ord r, Fractional r, LineSegment_ lineSegment point, Eq lineSegment, Point_ point 2 r, IntersectConstraints lineSegment, Foldable f) => f lineSegment -> Intersections r lineSegment
- type Intersections r lineSegment = Map (Point 2 r) (Associated lineSegment)
- data Associated lineSegment
- startPointOf :: forall lineSegment f. Functor f => (Set (AroundStart lineSegment) -> f (Set (AroundStart lineSegment))) -> Associated lineSegment -> f (Associated lineSegment)
- endPointOf :: forall lineSegment f. Functor f => (Set (AroundEnd lineSegment) -> f (Set (AroundEnd lineSegment))) -> Associated lineSegment -> f (Associated lineSegment)
- interiorTo :: forall lineSegment f. Functor f => (Set (AroundIntersection lineSegment) -> f (Set (AroundIntersection lineSegment))) -> Associated lineSegment -> f (Associated lineSegment)
- associatedSegments :: forall lineSegment f. (Contravariant f, Applicative f) => (lineSegment -> f lineSegment) -> Associated lineSegment -> f (Associated lineSegment)
- data AroundEnd a
- data AroundStart a
- data AroundIntersection a
- isInteriorIntersection :: Associated lineSegment -> Bool
- data IntersectionPoint point lineSegment
- intersectionPointOf :: (LineSegment_ lineSegment point, Point_ point 2 r, Ord r, Fractional r, IntersectConstraints lineSegment) => lineSegment -> lineSegment -> Maybe (IntersectionPoint (Point 2 r) lineSegment)
- intersectionPoint :: forall point lineSegment point' f. Functor f => (point -> f point') -> IntersectionPoint point lineSegment -> f (IntersectionPoint point' lineSegment)
- associatedSegs :: forall point lineSegment lineSegment' f. Functor f => (Associated lineSegment -> f (Associated lineSegment')) -> IntersectionPoint point lineSegment -> f (IntersectionPoint point lineSegment')
- type IntersectConstraints lineSegment = (OrdArounds lineSegment, IsIntersectableWith lineSegment lineSegment, Intersection lineSegment lineSegment ~ Maybe (LineSegmentLineSegmentIntersection lineSegment))
- type OrdArounds lineSegment = (Ord (AroundStart lineSegment), Ord (AroundIntersection lineSegment), Ord (AroundEnd lineSegment))
Documentation
intersections :: (Ord r, Fractional r, LineSegment_ lineSegment point, Eq lineSegment, Point_ point 2 r, IntersectConstraints lineSegment, Foldable f) => f lineSegment -> Intersections r lineSegment Source #
Compute all intersections (naively)
\(O(n^2)\)
type Intersections r lineSegment = Map (Point 2 r) (Associated lineSegment) Source #
For each intersection point the segments intersecting there.
data Associated lineSegment Source #
The line segments that contain a given point p may either have p as the endpoint or have p in their interior.
if somehow the segment is degenerate, and p is both the start and end it is reported only as the start point.
Instances
startPointOf :: forall lineSegment f. Functor f => (Set (AroundStart lineSegment) -> f (Set (AroundStart lineSegment))) -> Associated lineSegment -> f (Associated lineSegment) Source #
Lens to access the segments for which this is a startPoint
endPointOf :: forall lineSegment f. Functor f => (Set (AroundEnd lineSegment) -> f (Set (AroundEnd lineSegment))) -> Associated lineSegment -> f (Associated lineSegment) Source #
Lens to access the segments for which this is an endPoint
interiorTo :: forall lineSegment f. Functor f => (Set (AroundIntersection lineSegment) -> f (Set (AroundIntersection lineSegment))) -> Associated lineSegment -> f (Associated lineSegment) Source #
Lens to access the segments for which this point lies in the interior of the segment
associatedSegments :: forall lineSegment f. (Contravariant f, Applicative f) => (lineSegment -> f lineSegment) -> Associated lineSegment -> f (Associated lineSegment) Source #
Fold over the segments associated with the intersection.
Assumes that two segments have the same end point
Instances
Functor AroundEnd Source # | |||||
NFData a => NFData (AroundEnd a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types | |||||
Generic (AroundEnd a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types
| |||||
Read a => Read (AroundEnd a) Source # | |||||
Show a => Show (AroundEnd a) Source # | |||||
(Point_ point 2 r, Eq r, HasStart lineSegment point) => Eq (AroundEnd lineSegment) Source # | |||||
(LineSegment_ lineSegment point, Point_ point 2 r, Ord r, Num r, Eq lineSegment) => Ord (AroundEnd lineSegment) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types compare :: AroundEnd lineSegment -> AroundEnd lineSegment -> Ordering # (<) :: AroundEnd lineSegment -> AroundEnd lineSegment -> Bool # (<=) :: AroundEnd lineSegment -> AroundEnd lineSegment -> Bool # (>) :: AroundEnd lineSegment -> AroundEnd lineSegment -> Bool # (>=) :: AroundEnd lineSegment -> AroundEnd lineSegment -> Bool # max :: AroundEnd lineSegment -> AroundEnd lineSegment -> AroundEnd lineSegment # min :: AroundEnd lineSegment -> AroundEnd lineSegment -> AroundEnd lineSegment # | |||||
Wrapped (AroundEnd a) Source # | |||||
AroundEnd a ~ t => Rewrapped (AroundEnd a) t Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types | |||||
type Rep (AroundEnd a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types | |||||
type Unwrapped (AroundEnd a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types |
data AroundStart a Source #
Assumes that two segments have the same start point
Instances
Functor AroundStart Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types fmap :: (a -> b) -> AroundStart a -> AroundStart b # (<$) :: a -> AroundStart b -> AroundStart a # | |||||
NFData a => NFData (AroundStart a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types rnf :: AroundStart a -> () # | |||||
Generic (AroundStart a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types
from :: AroundStart a -> Rep (AroundStart a) x # to :: Rep (AroundStart a) x -> AroundStart a # | |||||
Read a => Read (AroundStart a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types readsPrec :: Int -> ReadS (AroundStart a) # readList :: ReadS [AroundStart a] # readPrec :: ReadPrec (AroundStart a) # readListPrec :: ReadPrec [AroundStart a] # | |||||
Show a => Show (AroundStart a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types showsPrec :: Int -> AroundStart a -> ShowS # show :: AroundStart a -> String # showList :: [AroundStart a] -> ShowS # | |||||
(Point_ point 2 r, Eq r, HasEnd lineSegment point) => Eq (AroundStart lineSegment) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types (==) :: AroundStart lineSegment -> AroundStart lineSegment -> Bool # (/=) :: AroundStart lineSegment -> AroundStart lineSegment -> Bool # | |||||
(LineSegment_ lineSegment point, Point_ point 2 r, Ord r, Num r) => Ord (AroundStart lineSegment) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types compare :: AroundStart lineSegment -> AroundStart lineSegment -> Ordering # (<) :: AroundStart lineSegment -> AroundStart lineSegment -> Bool # (<=) :: AroundStart lineSegment -> AroundStart lineSegment -> Bool # (>) :: AroundStart lineSegment -> AroundStart lineSegment -> Bool # (>=) :: AroundStart lineSegment -> AroundStart lineSegment -> Bool # max :: AroundStart lineSegment -> AroundStart lineSegment -> AroundStart lineSegment # min :: AroundStart lineSegment -> AroundStart lineSegment -> AroundStart lineSegment # | |||||
Wrapped (AroundStart a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types
_Wrapped' :: Iso' (AroundStart a) (Unwrapped (AroundStart a)) Source # | |||||
AroundStart a ~ t => Rewrapped (AroundStart a) t Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types | |||||
type Rep (AroundStart a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types type Rep (AroundStart a) = D1 ('MetaData "AroundStart" "HGeometry.LineSegment.Intersection.Types" "hgeometry-1.0.0.0-inplace" 'True) (C1 ('MetaCons "AroundStart" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a))) | |||||
type Unwrapped (AroundStart a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types |
data AroundIntersection a Source #
Assumes that two segments intersect in a single point.
Instances
Functor AroundIntersection Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types fmap :: (a -> b) -> AroundIntersection a -> AroundIntersection b # (<$) :: a -> AroundIntersection b -> AroundIntersection a # | |||||
NFData a => NFData (AroundIntersection a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types rnf :: AroundIntersection a -> () # | |||||
Generic (AroundIntersection a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types
from :: AroundIntersection a -> Rep (AroundIntersection a) x # to :: Rep (AroundIntersection a) x -> AroundIntersection a # | |||||
Read a => Read (AroundIntersection a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types readsPrec :: Int -> ReadS (AroundIntersection a) # readList :: ReadS [AroundIntersection a] # readPrec :: ReadPrec (AroundIntersection a) # readListPrec :: ReadPrec [AroundIntersection a] # | |||||
Show a => Show (AroundIntersection a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types showsPrec :: Int -> AroundIntersection a -> ShowS # show :: AroundIntersection a -> String # showList :: [AroundIntersection a] -> ShowS # | |||||
Eq a => Eq (AroundIntersection a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types (==) :: AroundIntersection a -> AroundIntersection a -> Bool # (/=) :: AroundIntersection a -> AroundIntersection a -> Bool # | |||||
(LineSegment_ lineSegment point, Point_ point 2 r, Ord r, Fractional r, Eq lineSegment, IsIntersectableWith lineSegment lineSegment, Intersection lineSegment lineSegment ~ Maybe (LineSegmentLineSegmentIntersection lineSegment)) => Ord (AroundIntersection lineSegment) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types compare :: AroundIntersection lineSegment -> AroundIntersection lineSegment -> Ordering # (<) :: AroundIntersection lineSegment -> AroundIntersection lineSegment -> Bool # (<=) :: AroundIntersection lineSegment -> AroundIntersection lineSegment -> Bool # (>) :: AroundIntersection lineSegment -> AroundIntersection lineSegment -> Bool # (>=) :: AroundIntersection lineSegment -> AroundIntersection lineSegment -> Bool # max :: AroundIntersection lineSegment -> AroundIntersection lineSegment -> AroundIntersection lineSegment # min :: AroundIntersection lineSegment -> AroundIntersection lineSegment -> AroundIntersection lineSegment # | |||||
Wrapped (AroundIntersection a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types
_Wrapped' :: Iso' (AroundIntersection a) (Unwrapped (AroundIntersection a)) Source # | |||||
AroundIntersection a ~ t => Rewrapped (AroundIntersection a) t Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types | |||||
type Rep (AroundIntersection a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types type Rep (AroundIntersection a) = D1 ('MetaData "AroundIntersection" "HGeometry.LineSegment.Intersection.Types" "hgeometry-1.0.0.0-inplace" 'True) (C1 ('MetaCons "AroundIntersection" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a))) | |||||
type Unwrapped (AroundIntersection a) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types |
isInteriorIntersection :: Associated lineSegment -> Bool Source #
Reports whether this associated has any interior intersections
\(O(1)\)
data IntersectionPoint point lineSegment Source #
An intersection point together with all segments intersecting at this point.
Instances
(NFData point, NFData lineSegment) => NFData (IntersectionPoint point lineSegment) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types rnf :: IntersectionPoint point lineSegment -> () # | |||||
Generic (IntersectionPoint point lineSegment) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types
from :: IntersectionPoint point lineSegment -> Rep (IntersectionPoint point lineSegment) x # to :: Rep (IntersectionPoint point lineSegment) x -> IntersectionPoint point lineSegment # | |||||
(Read lineSegment, Read point, OrdArounds lineSegment) => Read (IntersectionPoint point lineSegment) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types readsPrec :: Int -> ReadS (IntersectionPoint point lineSegment) # readList :: ReadS [IntersectionPoint point lineSegment] # readPrec :: ReadPrec (IntersectionPoint point lineSegment) # readListPrec :: ReadPrec [IntersectionPoint point lineSegment] # | |||||
(Show point, Show lineSegment) => Show (IntersectionPoint point lineSegment) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types showsPrec :: Int -> IntersectionPoint point lineSegment -> ShowS # show :: IntersectionPoint point lineSegment -> String # showList :: [IntersectionPoint point lineSegment] -> ShowS # | |||||
(Eq (AroundStart lineSegment), Eq (AroundIntersection lineSegment), Eq (AroundEnd lineSegment), Eq point) => Eq (IntersectionPoint point lineSegment) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types (==) :: IntersectionPoint point lineSegment -> IntersectionPoint point lineSegment -> Bool # (/=) :: IntersectionPoint point lineSegment -> IntersectionPoint point lineSegment -> Bool # | |||||
type Rep (IntersectionPoint point lineSegment) Source # | |||||
Defined in HGeometry.LineSegment.Intersection.Types type Rep (IntersectionPoint point lineSegment) = D1 ('MetaData "IntersectionPoint" "HGeometry.LineSegment.Intersection.Types" "hgeometry-1.0.0.0-inplace" 'False) (C1 ('MetaCons "IntersectionPoint" 'PrefixI 'True) (S1 ('MetaSel ('Just "_intersectionPoint") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 point) :*: S1 ('MetaSel ('Just "_associatedSegs") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Associated lineSegment)))) |
intersectionPointOf :: (LineSegment_ lineSegment point, Point_ point 2 r, Ord r, Fractional r, IntersectConstraints lineSegment) => lineSegment -> lineSegment -> Maybe (IntersectionPoint (Point 2 r) lineSegment) Source #
Given two segments, compute an IntersectionPoint representing their intersection (if such an intersection exists).
intersectionPoint :: forall point lineSegment point' f. Functor f => (point -> f point') -> IntersectionPoint point lineSegment -> f (IntersectionPoint point' lineSegment) Source #
Lens to access the intersectionp oint
associatedSegs :: forall point lineSegment lineSegment' f. Functor f => (Associated lineSegment -> f (Associated lineSegment')) -> IntersectionPoint point lineSegment -> f (IntersectionPoint point lineSegment') Source #
Lens to access the associated segments
type IntersectConstraints lineSegment = (OrdArounds lineSegment, IsIntersectableWith lineSegment lineSegment, Intersection lineSegment lineSegment ~ Maybe (LineSegmentLineSegmentIntersection lineSegment)) Source #
Shorthand for the more-or-less standard constraints that we need on LineSegments
type OrdArounds lineSegment = (Ord (AroundStart lineSegment), Ord (AroundIntersection lineSegment), Ord (AroundEnd lineSegment)) Source #