Bounds¶
A Bounds
object stores the spatial extent of one or more Drawable
objects. Bounds
objects come in two types: Bounds2d
for two-dimensional Drawable
objects and Bounds3d
for three-dimensional Drawable
objects. A Bounds
object may contain infinity values. Bounds
objects are intended to quickly assess whether any part of a Drawable
might intersect (be visible in) the space that is currently in view.
All Drawable
objects can produce their Bounds
object with the getBounds()
method (in fact, even a Bounds
objects implement getBounds()
, simply returning this
). It is also possible to create a Bounds
object directly. There are a couple of constructors:
Bounds2d b1 = new Bounds2d(3.4, 6.7, -5.6, 2.3); // Arguments are the absolute minimum and maximum values
System.out.println("b1: " + b1);
Bounds2d b2 = new Bounds2d(12.3, 23.4); // Arguments are ranges, symmetrically around 0.0
System.out.println("b2: " + b2);
PolyLine2d line = new PolyLine2d(new Point2d(1, 2), new Point2d(3, 4), new Point2d(-5, 12));
Bounds2d b3 = new Bounds2d(line.getPoints()); // Argument is Iterator<Point2d>
System.out.println("b3: " + b3);
Bounds2d b4 = line.getBounds(); // Of course, the PolyLine2d can create a Bounds2d by itself
System.out.println("b4: " + b4);
Point2d[] pointArray = new Point2d[] { new Point2d(1, 2), new Point2d(3, 4), new Point2d(-5, 12) };
Bounds2d b5 = new Bounds2d(pointArray);
System.out.println("b5: " + b5);
Collection<Drawable2d> drawableCollection = new LinkedHashSet<>();
drawableCollection.add(new Point2d(1, 2));
drawableCollection.add(new Point2d(3, 4));
drawableCollection.add(new Point2d(-5, 12));
Bounds2d b6 = new Bounds2d(drawableCollection);
System.out.println("b6: " + b6);
Bounds2d b7 = new Bounds2d(new Point2d(1, 2), new LineSegment2d(3, 4, -5, 12));
System.out.println("b7: " + b7);
This example code prints:
b1: Bounds2d [absoluteX[3.400000 : 6.700000], absoluteY[-5.600000 : 2.300000]] b2: Bounds2d [absoluteX[-6.150000 : 6.150000], absoluteY[-11.700000 : 11.700000]] b3: Bounds2d [absoluteX[-5.000000 : 3.000000], absoluteY[2.000000 : 12.000000]] b4: Bounds2d [absoluteX[-5.000000 : 3.000000], absoluteY[2.000000 : 12.000000]] b5: Bounds2d [absoluteX[-5.000000 : 3.000000], absoluteY[2.000000 : 12.000000]] b6: Bounds2d [absoluteX[-5.000000 : 3.000000], absoluteY[2.000000 : 12.000000]] b7: Bounds2d [absoluteX[-5.000000 : 3.000000], absoluteY[2.000000 : 12.000000]]
A Bounds
object implements Drawable
. Therefore it can produce an iterator that produces a series of Point
objects. These points are the vertices of the bound space (2D or 3D as appropriate). The iterator of a Bounds2d
will produce 4 Point2d
objects; the iterator of a Bounds3d
will produce 8 Point3d
objects.
Bounds2d bounds = new Bounds2d(new Ray2d(1, 2, Math.toRadians(45)));
for (Iterator<Point2d> iterator = bounds.getPoints(); iterator.hasNext();)
{
System.out.println(iterator.next());
}
Outputs:
Point2d [x=1.000000, y=2.000000] Point2d [x=1.000000, y=Infinity] Point2d [x=Infinity, y=2.000000] Point2d [x=Infinity, y=Infinity]
Please do not write code that depends on the order in which this iterator produces those points.
The actual boundaries of a Bounds
object can be accessed with methods and by directly reading the internal fields. E.g. getMinX()
returns the minimum x value, which can also be obtained by accessing the minX
field.
Using a Bounds
object¶
Bounds
objects implement a couple of set-like operations that all return a boolean value:
Method | Description |
---|---|
contains(double x, double y [, double z ]) |
Report whether a the Point with these coordinates is contained within the Bounds (on an edge/surface is considered outside) |
contains(Point point) |
Report whether a Point is contained within the Bounds (on an edge/surface is considered outside) |
contains(Drawable drawable) |
Report whether a Drawable is completely contained in the Bounds (no Point outside, or on an edge/surface) |
covers(double x, double y [, double z ]) |
Report wether the Point with these coordinates is contained within the Bounds , or on an edge/surface of the Bounds |
covers(Point point) |
Report whether a Point is contained within the Bounds , or on an edge/surface of the Bounds |
covers(Drawable drawable) |
Report whether no part of a Drawable is outside the Bounds |
disjoint(Bounds otherBounds) |
Report whether this Bounds is disjoint from another Bounds . Only touching an edge/surface is considered disjoint |
intersects(Bounds otherBounds) |
Report whether this Bounds object intersects another Bounds object. Only touching an edge/surface is not considered intersecting |
The method intersection(Bounds otherBounds)
creates a new Bounds
object that is the intersection of both. If the Bounds
objects do not intersect (or only touch), this method returns null
.