Skip to content

Commit 0f1e5ce

Browse files
authored
Merge pull request #1220 from Geode-solutions/expose_bbox_function
fix(Binding): Expose missing functions in BBox
2 parents 86ae352 + 009148b commit 0f1e5ce

4 files changed

Lines changed: 60 additions & 3 deletions

File tree

bindings/python/src/geometry/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ add_geode_python_binding(
2424
"geometry.cpp"
2525
"angle.cpp"
2626
"barycentric_coordinates.cpp"
27-
"basic_objects.cpp"
2827
"bounding_box.cpp"
28+
"basic_objects.cpp"
2929
"coordinate_system.cpp"
3030
"distance.cpp"
3131
"frame.cpp"

bindings/python/src/geometry/basic_objects.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,25 @@
9797
.def( "origin", &Ray##dimension##D::origin ) \
9898
.def( "direction", &Ray##dimension##D::direction )
9999

100+
#define PYTHON_BOUNDING_BOX_AND_BASIC_OBJECTS( dimension ) \
101+
const auto bbox##dimension = \
102+
"BoundingBox" + std::to_string( dimension ) + "D"; \
103+
auto pybbox##dimension = \
104+
module.attr( bbox##dimension.c_str() ) \
105+
.cast< pybind11::class_< BoundingBox##dimension##D > >(); \
106+
pybbox##dimension.def( \
107+
"intersects_ray", static_cast< bool ( BoundingBox##dimension##D::* )( \
108+
const Ray< dimension >& ) const >( \
109+
&BoundingBox##dimension##D::intersects ) ); \
110+
pybbox##dimension.def( "intersects_infinite_line", \
111+
static_cast< bool ( BoundingBox##dimension##D::* )( \
112+
const InfiniteLine< dimension >& ) const >( \
113+
&BoundingBox##dimension##D::intersects ) ); \
114+
pybbox##dimension.def( "intersects_segment", \
115+
static_cast< bool ( BoundingBox##dimension##D::* )( \
116+
const Segment< dimension >& ) const >( \
117+
&BoundingBox##dimension##D::intersects ) )
118+
100119
namespace geode
101120
{
102121
void define_basic_objects( pybind11::module& module )
@@ -169,5 +188,7 @@ namespace geode
169188
.def( pybind11::init< Segment3D, double >() )
170189
.def( "axis", &Cylinder::axis )
171190
.def( "radius", &Cylinder::radius );
191+
PYTHON_BOUNDING_BOX_AND_BASIC_OBJECTS( 2 );
192+
PYTHON_BOUNDING_BOX_AND_BASIC_OBJECTS( 3 );
172193
}
173194
} // namespace geode

bindings/python/src/geometry/bounding_box.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "../common.hpp"
2525

2626
#include <geode/geometry/basic_objects/infinite_line.hpp>
27+
#include <geode/geometry/basic_objects/segment.hpp>
2728
#include <geode/geometry/bounding_box.hpp>
2829
#include <geode/geometry/point.hpp>
2930

@@ -35,6 +36,7 @@
3536
.def( pybind11::init<>() ) \
3637
.def( "add_box", &BoundingBox##dimension##D::add_box ) \
3738
.def( "add_point", &BoundingBox##dimension##D::add_point ) \
39+
.def( "extends", &BoundingBox##dimension##D::extends ) \
3840
.def( "contains_point", \
3941
static_cast< bool ( BoundingBox##dimension##D::* )( \
4042
const Point< dimension >& ) const >( \
@@ -43,16 +45,19 @@
4345
static_cast< bool ( BoundingBox##dimension##D::* )( \
4446
const BoundingBox< dimension >& ) const >( \
4547
&BoundingBox##dimension##D::contains ) ) \
46-
.def( "intersects_bbox", \
48+
.def( "intersects_bounding_box", \
4749
static_cast< bool ( BoundingBox##dimension##D::* )( \
4850
const BoundingBox< dimension >& ) const >( \
4951
&BoundingBox##dimension##D::intersects ) ) \
52+
.def( "signed_distance", &BoundingBox##dimension##D::signed_distance ) \
5053
.def( "min", &BoundingBox##dimension##D::min ) \
5154
.def( "max", &BoundingBox##dimension##D::max ) \
5255
.def( "center", &BoundingBox##dimension##D::center ) \
5356
.def( "diagonal", &BoundingBox##dimension##D::diagonal ) \
5457
.def( "smallest_length", &BoundingBox##dimension##D::smallest_length ) \
55-
.def( "largest_length", &BoundingBox##dimension##D::largest_length )
58+
.def( "largest_length", &BoundingBox##dimension##D::largest_length ) \
59+
.def( "n_volume", &BoundingBox##dimension##D::n_volume ) \
60+
.def( "string", &BoundingBox##dimension##D::string )
5661

5762
namespace geode
5863
{

bindings/python/tests/geometry/test-py-bounding-box.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,34 @@
4747
raise ValueError("[Test] BBox should contain this point")
4848
if box2.contains_point(geom.Point2D([10, 0])):
4949
raise ValueError("[Test] BBox should not contain this point")
50+
51+
# --- 3D Bounding Box and Ray/Line intersections ---
52+
bbox3 = geom.BoundingBox3D()
53+
bbox3.add_point(geom.Point3D([-1, -1, -1]))
54+
bbox3.add_point(geom.Point3D([1, 1, 1]))
55+
56+
# Rays
57+
ray_inside = geom.Ray3D( geom.Vector3D([0, 0, 1]),geom.Point3D([0, 0, 0]))
58+
if not bbox3.intersects_ray(ray_inside):
59+
raise ValueError("[Test] Wrong result with ray_inside")
60+
61+
ray_up = geom.Ray3D( geom.Vector3D([0, 0, 1]),geom.Point3D([0, 0, 2]))
62+
if bbox3.intersects_ray(ray_up):
63+
raise ValueError("[Test] Wrong result with ray_up")
64+
65+
ray_down = geom.Ray3D( geom.Vector3D([0, 0, 1]),geom.Point3D([0, 0, -2]))
66+
if not bbox3.intersects_ray(ray_down):
67+
raise ValueError("[Test] Wrong result with ray_down")
68+
69+
# Infinite lines
70+
line_inside = geom.InfiniteLine3D( geom.Vector3D([0, 0, 1]),geom.Point3D([0, 0, 0]))
71+
if not bbox3.intersects_infinite_line(line_inside):
72+
raise ValueError("[Test] Wrong result with line_inside")
73+
74+
line_up = geom.InfiniteLine3D( geom.Vector3D([0, 0, 1]),geom.Point3D([0, 0, 2]))
75+
if not bbox3.intersects_infinite_line(line_up):
76+
raise ValueError("[Test] Wrong result with line_up")
77+
78+
line_down = geom.InfiniteLine3D( geom.Vector3D([0, 0, 1]),geom.Point3D([0, 0, -2]))
79+
if not bbox3.intersects_infinite_line(line_down):
80+
raise ValueError("[Test] Wrong result with line_down")

0 commit comments

Comments
 (0)