Portability | GHC |
---|---|
Stability | unstable |
Maintainer | stephen.tetley@gmail.com |
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 = BBox {}
- type DBoundingBox = BoundingBox Double
- class Boundary t where
- boundary :: u ~ DUnit t => t -> BoundingBox u
- boundingBox :: Ord u => Point2 u -> Point2 u -> BoundingBox u
- destBoundingBox :: BoundingBox u -> (u, u, u, u)
- boundaryUnion :: Ord u => BoundingBox u -> BoundingBox u -> BoundingBox u
- traceBoundary :: (Num u, Ord u) => [Point2 u] -> BoundingBox u
- retraceBoundary :: (Num u, Ord u) => (Point2 u -> Point2 u) -> BoundingBox u -> BoundingBox u
- boundaryCorners :: BoundingBox u -> (Point2 u, Point2 u, Point2 u, Point2 u)
- boundaryCornerList :: BoundingBox u -> [Point2 u]
- boundaryCenter :: Fractional u => BoundingBox u -> Point2 u
- withinBoundary :: (Tolerance u, Ord u) => Point2 u -> BoundingBox u -> Bool
- boundaryWidth :: Num u => BoundingBox u -> u
- boundaryHeight :: Num u => BoundingBox u -> u
Types
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.
Functor BoundingBox | |
(Tolerance u, Ord u) => Eq (BoundingBox u) | |
Show u => Show (BoundingBox u) | |
Format u => Format (BoundingBox u) | |
(Num u, Ord u) => Translate (BoundingBox u) | |
(Fractional u, Ord u) => Scale (BoundingBox u) | |
(Real u, Floating u, Ord u) => RotateAbout (BoundingBox u) | |
(Real u, Floating u, Ord u) => Rotate (BoundingBox u) | |
(Num u, Ord u) => Transform (BoundingBox u) | |
Boundary (BoundingBox u) |
type DBoundingBox = BoundingBox DoubleSource
Type class
Type class extracting the bounding box of an object - Picture, Path etc.
boundary :: u ~ DUnit t => t -> BoundingBox uSource
Constructors
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.
Operations
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.