## Overview

When working with geometry, it is often useful to talk about the volume of space containing a shape. The most commonly used volume is an axis-aligned bounding box, which can be easily calculated from a set of points, combined, or intersected. Testing whether a point lies within one is quick.

All definitions are in the **rose_bounds.h** header file.

The RoseBoundingBox class describes an axis-aligned bounding box. This box is formed by a pair of XY planes at the maximum and minimum Z coordinates, XZ planes at the max/min Y coordinates, and YZ planes at the max/min X coordinates. The class holds a pair of points that contain the maximum and minimum coordinate values, as shown below:

The RoseBoundingBox2D class describes a rectangle in the XY plane or UV space. The rectangle is formed by vertical and horizontal lines at the upper and lower coordinates. The class holds a pair of points that contain the maximum and minimum 2D coordinate values.

You can compute the boolean union of two bounding boxes with the update() member function and compute the boolean intersection of two volumes with the rose_bounds_intersect() function.

## rose_bounds_intersect()

introse_bounds_intersect( RoseBoundingBox& result, const RoseBoundingBox& box1, const RoseBoundingBox& box2, double tol=0 ); introse_bounds2d_intersect( RoseBoundingBox2D& result, const RoseBoundingBox2D& box1, const RoseBoundingBox2D& box2, double tol=0 );

The **rose_bounds_intersect**() function calculates the overlapping
volume between two bounding boxes and returns true if the result is
not empty. The bounds of the intersection region is stored in
the **result** parameter. The **rose_bounds2d_intersect**()
function is a 2D version that works with bounding rectangles.

By default, strict numeric comparison is used to determine whether there is any overlap. If the boxes overlap exactly at a face, say box1.minx() exactly equals box2.maxx(), the function will return true but the result will have zero thickness in the X direction.

If the optional **tol** value is given, the function uses a box
that extends **tol** further on each side when checking for overlap
with the other bounding box. The value can be negative if you need
to shrink the box.

When the faces are within **tol** of each other, but not
overlapping, the result volume will contain the distance between the
faces, which may be zero if the faces overlap exactly. If the boxes
overlap corner to corner, the closest points could be up
to `tol*ROSE_SQRT_3`

apart in 3D
or `tol*ROSE_SQRT_2`

apart in 2D.

// define box -1,-1,-1 to 10,10,10RoseBoundingBox b1; b1.update(-1, -1, -1); b1.update(10,10,10);// define box 9,9,9 to 12,12,12RoseBoundingBox b2; b2.update(9, 9, 9); b2.update(12, 12, 12);// define box 10.1,10.1,10.1 to 12,12,12RoseBoundingBox b3; b3.update(10.1, 10.1, 10.1); b3.update(12, 12, 12); RoseBoundingBox res;// good overlap ==> true // result box 9, 9, 9 to 10, 10, 10rose_bounds_intersect(res, b1, b2);// slightly separated ==> false // result box emptyrose_bounds_intersect(res, b1, b3);// slightly separated, but add 0.5 all around ==> true // result box 10, 10, 10 to 10.1, 10.1, 10.1rose_bounds_intersect(res, b1, b3, 0.5);