wumpus-core-0.52.1: Pure Haskell PostScript and SVG generation.

Safe HaskellSafe-Infered




Bounding box with no notion of 'empty'.

Empty pictures cannot be created with Wumpus. This significantly simplifies the implementation of pictures and bounding boxes.

Note - some of the functions exposed by this module are expected to be pertinent only to Wumpus-Core itself.



data BoundingBox u Source

Bounding box of a picture, path, etc. represented by the lower-left and upper-right corners.

Wumpus cannot construct empty pictures - so bounding boxes are spared the obligation to be empty. This greatly helps keep the implementation relatively simple.

BoundingBox operates as a semigroup where boundaryUnion is the addition.




ll_corner :: Point2 u
ur_corner :: Point2 u

Type class

class Boundary t whereSource

Type class extracting the bounding box of an object - Picture, Path etc.


boundary :: u ~ DUnit t => t -> BoundingBox uSource


boundingBox :: Ord u => Point2 u -> Point2 u -> BoundingBox uSource

boundingBox : lower_left_corner * upper_right_corner -> BoundingBox

Contruct a bounding box, vis the BBox constructor with range checking on the corner points.

boundingBox throws an error if the width or height of the constructed bounding box is negative.


destBoundingBox :: BoundingBox u -> (u, u, u, u)Source

destBoundingBox : bbox -> (lower_left_x, lower_left_y, upper_right_x, upper_right_y)

Destructor for BoundingBox, assembles a four-tuple of the x and y values of the corner points.

Arguably this is easier to pattern match upon, as it removes a layer of nesting.

boundaryUnion :: Ord u => BoundingBox u -> BoundingBox u -> BoundingBox uSource

The union of two bounding boxes.

traceBoundary :: (Num u, Ord u) => [Point2 u] -> BoundingBox uSource

traceBoundary : points -> BoundingBox

Trace a list of points, retuning the BoundingBox of their boundary.

** WARNING ** - trace throws a run-time error when supplied with the empty list.

retraceBoundary :: (Num u, Ord u) => (Point2 u -> Point2 u) -> BoundingBox u -> BoundingBox uSource

Perform the supplied transformation on the four corners of the bounding box. Trace the new corners to calculate the resulting bounding box.

NOTE - this helper function is used within Wumpus-Core to re-calculate a bounding box after a rotation for example. It is probably useful only to Wumpus-Core.

boundaryCorners :: BoundingBox u -> (Point2 u, Point2 u, Point2 u, Point2 u)Source

boundaryCorners : bbox -> (bottom_left, bottom_right, top_right, top_left)

Generate all the corners of a bounding box, counter-clock wise from the bottom left, i.e. (bl, br, tr, tl).

boundaryCornerList :: BoundingBox u -> [Point2 u]Source

boundaryCornerList : bbox -> [bottom_left, bottom_right, top_right, top_left]

Generate all the corners of a bounding box, counter-clock wise from the bottom left, i.e. [bl, br, tr, tl].

This is a list version of boundaryCorners which is sometimes more convenient. For instance, to create a vertex path it is more direct to use this list rather than build one from the 4-tuple returned by boundaryCorners.

boundaryCenter :: Fractional u => BoundingBox u -> Point2 uSource

boundaryCenter : bbox -> Point

Return the center of a bounding box.

withinBoundary :: (Tolerance u, Ord u) => Point2 u -> BoundingBox u -> BoolSource

withinBoundary : point * bbox -> Bool

Within test - is the supplied point within the bounding box?

boundaryWidth :: Num u => BoundingBox u -> uSource

boundaryWidth : bbox -> Width

Extract the width of a bounding box.

boundaryHeight :: Num u => BoundingBox u -> uSource

boundaryHeight : bbox -> Height

Extract the height of a bounding box.