|
Geometry : |
Subject: [ggl] Point/Box in Box Test (Border Cases - 3D)
From: Frank Glinka (glinkaf)
Date: 2011-06-28 05:54:12
Hi,
does boost.geometry currently provide a way to do "geometry1 within
geometry2" tests including border cases?
-------------------------------------------------------------------
That's my basic question! If required - more details of what I want
to do:
1) Test whether a point lies in a box including being on the border
based on the boost::geometry::within function.
Example: boost::geometry::within(Point3D(0, 0, 0),
Box3D(Point3D(0, 0, 0), Point3D(1, 1, 1)) delivers false.
The test succeeds for points that are within the box but not on the
border.
I am aware that boost::geometry::intersects works for point-in-box
tests including border cases but has two drawbacks:
i) It seems to be 30% slower for point-in-box tests.
ii) I would like to use the same call to boost::geometry for
box-in-box, point-in-box or even polygon in polygon tests
(boost::within does allow this, although its return values
aren't as desired).
2) Test whether a box lies within a box, including being on the border?
Trivial example:
const Box3D box(Point3D(0,0,0), Point3D(1, 1, 1));
boost::geometry::within(box, box) delivers false.
The test succeeds for boxes that are within the given box but do not
touch the border.
3) What about point/polygon in polygon tests with respect to border
cases? I haven't tested them yet...
The data structures that I use in the above examples:
// Create custom point type.
struct Point3D {
float x, y, z;
Point3D() : x(0.0), y(0.0), z(0.0) {}
Point3D(float a, float b, float c) : x(a), y(b), z(c) {}
};
// Create custom box type.
struct Box3D {
Box3D() : origin(Point3D(0.0, 0.0, 0.0)),
size(Point3D(0.0, 0.0, 0.0)) {}
Box3D(Point3D a, Point3D b) : origin(a), size(b) {}
Point3D origin, size;
};
// Register custom types.
BOOST_GEOMETRY_REGISTER_POINT_3D(Point3D, float,
boost::geometry::cs::cartesian, x, y, z)
BOOST_GEOMETRY_REGISTER_BOX(Box3D, Point3D, origin, size);
Best regards,
Frank
Geometry list run by mateusz at loskot.net