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 :: 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.

Eq u => Eq (BoundingBox u) | |

Show u => Show (BoundingBox u) | |

PSUnit u => Format (BoundingBox u) | |

(Num u, Ord u) => Translate (BoundingBox u) | |

(Num u, Ord u) => Scale (BoundingBox u) | |

(Real u, Floating u) => RotateAbout (BoundingBox u) | |

(Real u, Floating u) => Rotate (BoundingBox u) | |

(Num u, Ord u) => Transform (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 :: 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.