hgeometry-0.9.0.0: Geometric Algorithms, Data structures, and Data types.

Data.Geometry.Point

Description

$$d$$-dimensional points.

Synopsis

# Documentation

>>> :{
let myVector :: Vector 3 Int
myVector = Vector3 1 2 3
myPoint = Point myVector
:}


# A d-dimensional Point

newtype Point d r Source #

A d-dimensional point.

Constructors

 Point FieldstoVec :: Vector d r
Instances
 Arity d => Functor (Point d) Source # Instance detailsDefined in Data.Geometry.Point Methodsfmap :: (a -> b) -> Point d a -> Point d b #(<$) :: a -> Point d b -> Point d a # Arity d => Foldable (Point d) Source # Instance detailsDefined in Data.Geometry.Point Methodsfold :: Monoid m => Point d m -> m #foldMap :: Monoid m => (a -> m) -> Point d a -> m #foldr :: (a -> b -> b) -> b -> Point d a -> b #foldr' :: (a -> b -> b) -> b -> Point d a -> b #foldl :: (b -> a -> b) -> b -> Point d a -> b #foldl' :: (b -> a -> b) -> b -> Point d a -> b #foldr1 :: (a -> a -> a) -> Point d a -> a #foldl1 :: (a -> a -> a) -> Point d a -> a #toList :: Point d a -> [a] #null :: Point d a -> Bool #length :: Point d a -> Int #elem :: Eq a => a -> Point d a -> Bool #maximum :: Ord a => Point d a -> a #minimum :: Ord a => Point d a -> a #sum :: Num a => Point d a -> a #product :: Num a => Point d a -> a # Arity d => Traversable (Point d) Source # Instance detailsDefined in Data.Geometry.Point Methodstraverse :: Applicative f => (a -> f b) -> Point d a -> f (Point d b) #sequenceA :: Applicative f => Point d (f a) -> f (Point d a) #mapM :: Monad m => (a -> m b) -> Point d a -> m (Point d b) #sequence :: Monad m => Point d (m a) -> m (Point d a) # (Arity d, Ord r) => Semigroup (CWMin (Point d r)) Source # Instance detailsDefined in Data.Geometry.Box.Internal Methods(<>) :: CWMin (Point d r) -> CWMin (Point d r) -> CWMin (Point d r) #sconcat :: NonEmpty (CWMin (Point d r)) -> CWMin (Point d r) #stimes :: Integral b => b -> CWMin (Point d r) -> CWMin (Point d r) # (Arity d, Ord r) => Semigroup (CWMax (Point d r)) Source # Instance detailsDefined in Data.Geometry.Box.Internal Methods(<>) :: CWMax (Point d r) -> CWMax (Point d r) -> CWMax (Point d r) #sconcat :: NonEmpty (CWMax (Point d r)) -> CWMax (Point d r) #stimes :: Integral b => b -> CWMax (Point d r) -> CWMax (Point d r) # Arity d => Affine (Point d) Source # Instance detailsDefined in Data.Geometry.Point Associated Typestype Diff (Point d) :: Type -> Type # Methods(.-.) :: Num a => Point d a -> Point d a -> Diff (Point d) a #(.+^) :: Num a => Point d a -> Diff (Point d) a -> Point d a #(.-^) :: Num a => Point d a -> Diff (Point d) a -> Point d a # Source # Instance detailsDefined in Data.Geometry.Point Methodspmap :: (Point (Dimension (Point d r)) r -> Point (Dimension (Point d s)) s) -> Point d r -> Point d s Source # (Eq r, Arity d) => Eq (Point d r) Source # Instance detailsDefined in Data.Geometry.Point Methods(==) :: Point d r -> Point d r -> Bool #(/=) :: Point d r -> Point d r -> Bool # (Ord r, Arity d) => Ord (Point d r) Source # Instance detailsDefined in Data.Geometry.Point Methodscompare :: Point d r -> Point d r -> Ordering #(<) :: Point d r -> Point d r -> Bool #(<=) :: Point d r -> Point d r -> Bool #(>) :: Point d r -> Point d r -> Bool #(>=) :: Point d r -> Point d r -> Bool #max :: Point d r -> Point d r -> Point d r #min :: Point d r -> Point d r -> Point d r # (Read r, Arity d) => Read (Point d r) Source # Instance detailsDefined in Data.Geometry.Point MethodsreadsPrec :: Int -> ReadS (Point d r) #readList :: ReadS [Point d r] #readPrec :: ReadPrec (Point d r) #readListPrec :: ReadPrec [Point d r] # (Show r, Arity d) => Show (Point d r) Source # Instance detailsDefined in Data.Geometry.Point MethodsshowsPrec :: Int -> Point d r -> ShowS #show :: Point d r -> String #showList :: [Point d r] -> ShowS # Generic (Point d r) Source # Instance detailsDefined in Data.Geometry.Point Associated Typestype Rep (Point d r) :: Type -> Type # Methodsfrom :: Point d r -> Rep (Point d r) x #to :: Rep (Point d r) x -> Point d r # (Arity d, NFData r) => NFData (Point d r) Source # Instance detailsDefined in Data.Geometry.Point Methodsrnf :: Point d r -> () # (Arity d, Arbitrary r) => Arbitrary (Point d r) Source # Instance detailsDefined in Data.Geometry.Point Methodsarbitrary :: Gen (Point d r)shrink :: Point d r -> [Point d r] (FromJSON r, Arity d, KnownNat d) => FromJSON (Point d r) Source # Instance detailsDefined in Data.Geometry.Point MethodsparseJSON :: Value -> Parser (Point d r)parseJSONList :: Value -> Parser [Point d r] (ToJSON r, Arity d) => ToJSON (Point d r) Source # Instance detailsDefined in Data.Geometry.Point MethodstoJSON :: Point d r -> ValuetoEncoding :: Point d r -> EncodingtoJSONList :: [Point d r] -> ValuetoEncodingList :: [Point d r] -> Encoding (Fractional r, Arity d, Arity (d + 1)) => IsTransformable (Point d r) Source # Instance detailsDefined in Data.Geometry.Transformation MethodstransformBy :: Transformation (Dimension (Point d r)) (NumType (Point d r)) -> Point d r -> Point d r Source # IsBoxable (Point d r) Source # Instance detailsDefined in Data.Geometry.Box.Internal MethodsboundingBox :: Point d r -> Box (Dimension (Point d r)) () (NumType (Point d r)) Source # (Eq r, Fractional r, Arity d) => IsIntersectableWith (Point d r) (Line d r) Instance detailsDefined in Data.Geometry.Line Methodsintersect :: Point d r -> Line d r -> Intersection (Point d r) (Line d r)intersects :: Point d r -> Line d r -> BoolnonEmptyIntersection :: proxy (Point d r) -> proxy (Line d r) -> Intersection (Point d r) (Line d r) -> Bool (Num r, Eq r, Arity d) => IsIntersectableWith (Point d r) (HyperPlane d r) Instance detailsDefined in Data.Geometry.HyperPlane Methodsintersect :: Point d r -> HyperPlane d r -> Intersection (Point d r) (HyperPlane d r)intersects :: Point d r -> HyperPlane d r -> BoolnonEmptyIntersection :: proxy (Point d r) -> proxy (HyperPlane d r) -> Intersection (Point d r) (HyperPlane d r) -> Bool (Num r, Ord r, Arity d) => IsIntersectableWith (Point d r) (HalfSpace d r) Instance detailsDefined in Data.Geometry.HalfSpace Methodsintersect :: Point d r -> HalfSpace d r -> Intersection (Point d r) (HalfSpace d r)intersects :: Point d r -> HalfSpace d r -> BoolnonEmptyIntersection :: proxy (Point d r) -> proxy (HalfSpace d r) -> Intersection (Point d r) (HalfSpace d r) -> Bool (Ord r, Num r) => IsIntersectableWith (Point 2 r) (Line 2 r) Instance detailsDefined in Data.Geometry.Line Methodsintersect :: Point 2 r -> Line 2 r -> Intersection (Point 2 r) (Line 2 r)intersects :: Point 2 r -> Line 2 r -> BoolnonEmptyIntersection :: proxy (Point 2 r) -> proxy (Line 2 r) -> Intersection (Point 2 r) (Line 2 r) -> Bool (Arity d, Ord r) => IsIntersectableWith (Point d r) (Box d p r) Instance detailsDefined in Data.Geometry.Box.Internal Methodsintersect :: Point d r -> Box d p r -> Intersection (Point d r) (Box d p r)intersects :: Point d r -> Box d p r -> BoolnonEmptyIntersection :: proxy (Point d r) -> proxy (Box d p r) -> Intersection (Point d r) (Box d p r) -> Bool (Fractional r, Ord r) => IsIntersectableWith (Point 2 r) (Polygon t p r) Instance detailsDefined in Data.Geometry.Polygon Methodsintersect :: Point 2 r -> Polygon t p r -> Intersection (Point 2 r) (Polygon t p r)intersects :: Point 2 r -> Polygon t p r -> BoolnonEmptyIntersection :: proxy (Point 2 r) -> proxy (Polygon t p r) -> Intersection (Point 2 r) (Polygon t p r) -> Bool type Diff (Point d) Source # Instance detailsDefined in Data.Geometry.Point type Diff (Point d) = Vector d type Rep (Point d r) Source # Instance detailsDefined in Data.Geometry.Point type Rep (Point d r) = D1 (MetaData "Point" "Data.Geometry.Point" "hgeometry-0.9.0.0-inplace" True) (C1 (MetaCons "Point" PrefixI True) (S1 (MetaSel (Just "toVec") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (Vector d r)))) type NumType (Point d r) Source # Instance detailsDefined in Data.Geometry.Point type NumType (Point d r) = r type Dimension (Point d r) Source # Instance detailsDefined in Data.Geometry.Point type Dimension (Point d r) = d type IntersectionOf (Point d r) (Line d r) Instance detailsDefined in Data.Geometry.Line type IntersectionOf (Point d r) (Line d r) = NoIntersection ': (Point d r ': ([] :: [Type])) type IntersectionOf (Point d r) (HyperPlane d r) Instance detailsDefined in Data.Geometry.HyperPlane type IntersectionOf (Point d r) (HyperPlane d r) = NoIntersection ': (Point d r ': ([] :: [Type])) type IntersectionOf (Point d r) (HalfSpace d r) Instance detailsDefined in Data.Geometry.HalfSpace type IntersectionOf (Point d r) (HalfSpace d r) = NoIntersection ': (Point d r ': ([] :: [Type])) type IntersectionOf (Point d r) (Box d p r) Instance detailsDefined in Data.Geometry.Box.Internal type IntersectionOf (Point d r) (Box d p r) = NoIntersection ': (Point d r ': ([] :: [Type])) type IntersectionOf (Point 2 r) (Polygon t p r) Instance detailsDefined in Data.Geometry.Polygon type IntersectionOf (Point 2 r) (Polygon t p r) = NoIntersection ': (Point 2 r ': ([] :: [Type])) readPt :: forall d r. (Arity d, Read r) => ReadP (Point d r) Source # origin :: (Arity d, Num r) => Point d r Source # Point representing the origin in d dimensions >>> origin :: Point 4 Int Point4 [0,0,0,0]  ## Accessing points vector :: Lens' (Point d r) (Vector d r) Source # Lens to access the vector corresponding to this point. >>> (point3 1 2 3) ^. vector Vector3 [1,2,3] >>> origin & vector .~ Vector3 1 2 3 Point3 [1,2,3]  unsafeCoord :: Arity d => Int -> Lens' (Point d r) r Source # Get the coordinate in a given dimension. This operation is unsafe in the sense that no bounds are checked. Consider using coord instead. >>> point3 1 2 3 ^. unsafeCoord 2 2  coord :: forall proxy i d r. (1 <= i, i <= d, ((i - 1) + 1) ~ i, Arity (i - 1), Arity d) => proxy i -> Lens' (Point d r) r Source # Get the coordinate in a given dimension >>> point3 1 2 3 ^. coord (C :: C 2) 2 >>> point3 1 2 3 & coord (C :: C 1) .~ 10 Point3 [10,2,3] >>> point3 1 2 3 & coord (C :: C 3) %~ (+1) Point3 [1,2,4]  pointFromList :: Arity d => [r] -> Maybe (Point d r) Source # Constructs a point from a list of coordinates >>> pointFromList [1,2,3] :: Maybe (Point 3 Int) Just Point3 [1,2,3]  projectPoint :: (Arity i, Arity d, i <= d) => Point d r -> Point i r Source # Project a point down into a lower dimension. # Convenience functions to construct 2 and 3 dimensional points pattern Point2 :: r -> r -> Point 2 r Source # We provide pattern synonyms Point2 and Point3 for 2 and 3 dimensional points. i.e. we can write: >>> :{  let f :: Point 2 r -> r f (Point2 x y) = x in f (point2 1 2) :} 1  if we want. pattern Point3 :: r -> r -> r -> Point 3 r Source # Similarly, we can write: >>> :{  let g :: Point 3 r -> r g (Point3 x y z) = z in g myPoint :} 3  point2 :: r -> r -> Point 2 r Source # Construct a 2 dimensional point >>> point2 1 2 Point2 [1,2]  _point2 :: Point 2 r -> (r, r) Source # Destruct a 2 dimensional point >>> _point2$ point2 1 2
(1,2)


point3 :: r -> r -> r -> Point 3 r Source #

Construct a 3 dimensional point

>>> point3 1 2 3
Point3 [1,2,3]


_point3 :: Point 3 r -> (r, r, r) Source #

Destruct a 3 dimensional point

>>> _point3 \$ point3 1 2 3
(1,2,3)


xCoord :: (1 <= d, Arity d) => Lens' (Point d r) r Source #

Shorthand to access the first coordinate C 1

>>> point3 1 2 3 ^. xCoord
1
>>> point2 1 2 & xCoord .~ 10
Point2 [10,2]


yCoord :: (2 <= d, Arity d) => Lens' (Point d r) r Source #

Shorthand to access the second coordinate C 2

>>> point2 1 2 ^. yCoord
2
>>> point3 1 2 3 & yCoord %~ (+1)
Point3 [1,3,3]


zCoord :: (3 <= d, Arity d) => Lens' (Point d r) r Source #

Shorthand to access the third coordinate C 3

>>> point3 1 2 3 ^. zCoord
3
>>> point3 1 2 3 & zCoord %~ (+1)
Point3 [1,2,4]


# Point Functors

class PointFunctor g where Source #

Types that we can transform by mapping a function on each point in the structure

Methods

pmap :: (Point (Dimension (g r)) r -> Point (Dimension (g s)) s) -> g r -> g s Source #

Instances
 Source # Instance detailsDefined in Data.Geometry.Point Methodspmap :: (Point (Dimension (Point d r)) r -> Point (Dimension (Point d s)) s) -> Point d r -> Point d s Source # Source # Instance detailsDefined in Data.Geometry.Polygon.Convex Methodspmap :: (Point (Dimension (ConvexPolygon p r)) r -> Point (Dimension (ConvexPolygon p s)) s) -> ConvexPolygon p r -> ConvexPolygon p s Source # PointFunctor (Box d p) Source # Instance detailsDefined in Data.Geometry.Box.Internal Methodspmap :: (Point (Dimension (Box d p r)) r -> Point (Dimension (Box d p s)) s) -> Box d p r -> Box d p s Source # Source # Instance detailsDefined in Data.Geometry.LineSegment Methodspmap :: (Point (Dimension (LineSegment d p r)) r -> Point (Dimension (LineSegment d p s)) s) -> LineSegment d p r -> LineSegment d p s Source # PointFunctor (PolyLine d p) Source # Instance detailsDefined in Data.Geometry.PolyLine Methodspmap :: (Point (Dimension (PolyLine d p r)) r -> Point (Dimension (PolyLine d p s)) s) -> PolyLine d p r -> PolyLine d p s Source # PointFunctor (Triangle d p) Source # Instance detailsDefined in Data.Geometry.Triangle Methodspmap :: (Point (Dimension (Triangle d p r)) r -> Point (Dimension (Triangle d p s)) s) -> Triangle d p r -> Triangle d p s Source # PointFunctor (Polygon t p) Source # Instance detailsDefined in Data.Geometry.Polygon Methodspmap :: (Point (Dimension (Polygon t p r)) r -> Point (Dimension (Polygon t p s)) s) -> Polygon t p r -> Polygon t p s Source #

# Functions specific to Two Dimensional points

data CCW Source #

Constructors

 CCW CoLinear CW
Instances
 Source # Instance detailsDefined in Data.Geometry.Point Methods(==) :: CCW -> CCW -> Bool #(/=) :: CCW -> CCW -> Bool # Source # Instance detailsDefined in Data.Geometry.Point MethodsshowsPrec :: Int -> CCW -> ShowS #show :: CCW -> String #showList :: [CCW] -> ShowS #

ccw :: (Ord r, Num r) => Point 2 r -> Point 2 r -> Point 2 r -> CCW Source #

Given three points p q and r determine the orientation when going from p to r via q.

ccw' :: (Ord r, Num r) => (Point 2 r :+ a) -> (Point 2 r :+ b) -> (Point 2 r :+ c) -> CCW Source #

Given three points p q and r determine the orientation when going from p to r via q.

sortArround :: (Ord r, Num r) => (Point 2 r :+ q) -> [Point 2 r :+ p] -> [Point 2 r :+ p] Source #

Sort the points arround the given point p in counter clockwise order with respect to the rightward horizontal ray starting from p. If two points q and r are colinear with p, the closest one to p is reported first. running time: O(n log n)

Quadrants of two dimensional points. in CCW order

Constructors

 TopRight TopLeft BottomLeft BottomRight
Instances
 Source # Instance detailsDefined in Data.Geometry.Point Methods Source # Instance detailsDefined in Data.Geometry.Point MethodsenumFrom :: Quadrant -> [Quadrant] #enumFromTo :: Quadrant -> Quadrant -> [Quadrant] # Source # Instance detailsDefined in Data.Geometry.Point Methods Source # Instance detailsDefined in Data.Geometry.Point Methods(<) :: Quadrant -> Quadrant -> Bool #(>) :: Quadrant -> Quadrant -> Bool # Source # Instance detailsDefined in Data.Geometry.Point Methods Source # Instance detailsDefined in Data.Geometry.Point MethodsshowList :: [Quadrant] -> ShowS #

quadrantWith :: (Ord r, 1 <= d, 2 <= d, Arity d) => (Point d r :+ q) -> (Point d r :+ p) -> Quadrant Source #

Quadrants around point c; quadrants are closed on their "previous" boundary (i..e the boundary with the previous quadrant in the CCW order), open on next boundary. The origin itself is assigned the topRight quadrant

quadrant :: (Ord r, Num r, 1 <= d, 2 <= d, Arity d) => (Point d r :+ p) -> Quadrant Source #

Quadrants with respect to the origin

partitionIntoQuadrants :: (Ord r, 1 <= d, 2 <= d, Arity d) => (Point d r :+ q) -> [Point d r :+ p] -> ([Point d r :+ p], [Point d r :+ p], [Point d r :+ p], [Point d r :+ p]) Source #

Given a center point c, and a set of points, partition the points into quadrants around c (based on their x and y coordinates). The quadrants are reported in the order topLeft, topRight, bottomLeft, bottomRight. The points are in the same order as they were in the original input lists. Points with the same x-or y coordinate as p, are "rounded" to above.

ccwCmpAround :: (Num r, Ord r) => (Point 2 r :+ qc) -> (Point 2 r :+ p) -> (Point 2 r :+ q) -> Ordering Source #

Counter clockwise ordering of the points around c. Points are ordered with respect to the positive x-axis. Points nearer to the center come before points further away.

cwCmpAround :: (Num r, Ord r) => (Point 2 r :+ qc) -> (Point 2 r :+ p) -> (Point 2 r :+ q) -> Ordering Source #

Clockwise ordering of the points around c. Points are ordered with respect to the positive x-axis. Points nearer to the center come before points further away.

insertIntoCyclicOrder :: (Ord r, Num r) => (Point 2 r :+ q) -> (Point 2 r :+ p) -> CList (Point 2 r :+ p) -> CList (Point 2 r :+ p) Source #

Given a center c, a new point p, and a list of points ps, sorted in counter clockwise order around c. Insert p into the cyclic order. The focus of the returned cyclic list is the new point p.

running time: O(n)

squaredEuclideanDist :: (Num r, Arity d) => Point d r -> Point d r -> r Source #

Squared Euclidean distance between two points

euclideanDist :: (Floating r, Arity d) => Point d r -> Point d r -> r Source #

Euclidean distance between two points