Skip to content

Commit 5fab6b9

Browse files
committed
perf(AABB): return only the distance from the closest_element query
BREAKING CHANGE: the return type of AABBTree::closest_element_box changed by losing the point
1 parent 97c1eb5 commit 5fab6b9

13 files changed

+50
-96
lines changed

include/geode/geometry/aabb.h

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -89,19 +89,16 @@ namespace geode
8989
* - the distance between the \p query and \p nearest_point.
9090
*
9191
* @tparam EvalDistance this functor should have an operator()
92-
* defined like this: std::tuple< double, Point< dimension > >
93-
* operator()( const Point< dimension >& query, index_t
94-
* curent_element_box ) const ; the output tuple contains
95-
* - a double to store the distance between the point \p query and
96-
* the element stored in the \p curent_element_box.
97-
* - a Point< dimension > to store the nearest point from \p query
98-
* on the object stored in the \p curent_element_box.
92+
* defined like this: double operator()( const Point< dimension >&
93+
* query, index_t curent_element_box ) const ; the output is the
94+
* distance between the point \p query and the element stored in the
95+
* \p curent_element_box.
9996
*
10097
* @note if several elements box match the
10198
* distance computation, then one of them will be randomly returned.
10299
*/
103100
template < typename EvalDistance >
104-
std::tuple< index_t, Point< dimension >, double > closest_element_box(
101+
std::tuple< index_t, double > closest_element_box(
105102
const Point< dimension >& query, const EvalDistance& action ) const;
106103

107104
/*!

include/geode/geometry/detail/aabb_impl.h

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,6 @@ namespace geode
166166
template < typename ACTION >
167167
void closest_element_box_recursive( const Point< dimension >& query,
168168
index_t& nearest_box,
169-
Point< dimension >& nearest_point,
170169
double& distance,
171170
index_t node_index,
172171
index_t element_begin,
@@ -274,23 +273,19 @@ namespace geode
274273

275274
template < index_t dimension >
276275
template < typename EvalDistance >
277-
std::tuple< index_t, Point< dimension >, double >
278-
AABBTree< dimension >::closest_element_box(
279-
const Point< dimension >& query, const EvalDistance& action ) const
276+
std::tuple< index_t, double > AABBTree< dimension >::closest_element_box(
277+
const Point< dimension >& query, const EvalDistance& action ) const
280278
{
281279
if( nb_bboxes() == 0 )
282280
{
283-
return std::make_tuple( NO_ID, query, 0 );
281+
return std::make_tuple( NO_ID, 0 );
284282
}
285283
auto nearest_box = impl_->closest_element_box_hint( query );
286-
double distance;
287-
Point< dimension > nearest_point;
288-
std::tie( distance, nearest_point ) = action( query, nearest_box );
289-
290-
impl_->closest_element_box_recursive( query, nearest_box, nearest_point,
291-
distance, Impl::ROOT_INDEX, 0, nb_bboxes(), action );
284+
auto distance = action( query, nearest_box );
285+
impl_->closest_element_box_recursive( query, nearest_box, distance,
286+
Impl::ROOT_INDEX, 0, nb_bboxes(), action );
292287
OPENGEODE_ASSERT( nearest_box != NO_ID, "No box found" );
293-
return std::make_tuple( nearest_box, nearest_point, distance );
288+
return std::make_tuple( nearest_box, distance );
294289
}
295290

296291
template < index_t dimension >
@@ -390,7 +385,6 @@ namespace geode
390385
void AABBTree< dimension >::Impl::closest_element_box_recursive(
391386
const Point< dimension >& query,
392387
index_t& nearest_box,
393-
Point< dimension >& nearest_point,
394388
double& distance,
395389
index_t node_index,
396390
index_t box_begin,
@@ -407,13 +401,10 @@ namespace geode
407401
{
408402
const auto cur_box = mapping_morton( box_begin );
409403
Point< dimension > cur_nearest_point;
410-
double cur_distance;
411-
std::tie( cur_distance, cur_nearest_point ) =
412-
action( query, cur_box );
404+
const auto cur_distance = action( query, cur_box );
413405
if( cur_distance < distance )
414406
{
415407
nearest_box = cur_box;
416-
nearest_point = cur_nearest_point;
417408
distance = cur_distance;
418409
}
419410
return;
@@ -431,30 +422,26 @@ namespace geode
431422
{
432423
if( distance_left < distance )
433424
{
434-
closest_element_box_recursive( query, nearest_box,
435-
nearest_point, distance, it.child_left, box_begin,
436-
it.middle_box, action );
425+
closest_element_box_recursive( query, nearest_box, distance,
426+
it.child_left, box_begin, it.middle_box, action );
437427
}
438428
if( distance_right < distance )
439429
{
440-
closest_element_box_recursive( query, nearest_box,
441-
nearest_point, distance, it.child_right, it.middle_box,
442-
box_end, action );
430+
closest_element_box_recursive( query, nearest_box, distance,
431+
it.child_right, it.middle_box, box_end, action );
443432
}
444433
}
445434
else
446435
{
447436
if( distance_right < distance )
448437
{
449-
closest_element_box_recursive( query, nearest_box,
450-
nearest_point, distance, it.child_right, it.middle_box,
451-
box_end, action );
438+
closest_element_box_recursive( query, nearest_box, distance,
439+
it.child_right, it.middle_box, box_end, action );
452440
}
453441
if( distance_left < distance )
454442
{
455-
closest_element_box_recursive( query, nearest_box,
456-
nearest_point, distance, it.child_left, box_begin,
457-
it.middle_box, action );
443+
closest_element_box_recursive( query, nearest_box, distance,
444+
it.child_left, box_begin, it.middle_box, action );
458445
}
459446
}
460447
}

include/geode/mesh/helpers/aabb_edged_curve_helpers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ namespace geode
5555
{
5656
}
5757

58-
std::tuple< double, Point< dimension > > operator()(
58+
double operator()(
5959
const Point< dimension >& query, index_t cur_box ) const;
6060

6161
private:

include/geode/mesh/helpers/aabb_solid_helpers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ namespace geode
5151
{
5252
}
5353

54-
std::tuple< double, Point< dimension > > operator()(
54+
double operator()(
5555
const Point< dimension >& query, index_t cur_box ) const;
5656

5757
private:

include/geode/mesh/helpers/aabb_surface_helpers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ namespace geode
5757
{
5858
}
5959

60-
std::tuple< double, Point< dimension > > operator()(
60+
double operator()(
6161
const Point< dimension >& query, index_t cur_box ) const;
6262

6363
private:

src/geode/mesh/helpers/aabb_edged_curve_helpers.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,11 @@ namespace geode
5858
}
5959

6060
template < index_t dimension >
61-
std::tuple< double, Point< dimension > >
62-
DistanceToEdge< dimension >::operator()(
63-
const Point< dimension >& query, index_t cur_box ) const
61+
double DistanceToEdge< dimension >::operator()(
62+
const Point< dimension >& query, index_t cur_box ) const
6463
{
6564
const auto segment = mesh_.segment( cur_box );
66-
return std::make_tuple( point_segment_distance( query, segment ),
67-
point_segment_projection( query, segment ) );
65+
return point_segment_distance( query, segment );
6866
}
6967

7068
template opengeode_mesh_api AABBTree2D create_aabb_tree< 2 >(

src/geode/mesh/helpers/aabb_solid_helpers.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,11 @@ namespace geode
5353
}
5454

5555
template < index_t dimension >
56-
std::tuple< double, Point< dimension > >
57-
DistanceToTetrahedron< dimension >::operator()(
58-
const Point< dimension >& query, index_t cur_box ) const
56+
double DistanceToTetrahedron< dimension >::operator()(
57+
const Point< dimension >& query, index_t cur_box ) const
5958
{
60-
return point_tetrahedron_distance(
61-
query, mesh_.tetrahedron( cur_box ) );
59+
return std::get< 0 >(
60+
point_tetrahedron_distance( query, mesh_.tetrahedron( cur_box ) ) );
6261
}
6362

6463
template opengeode_mesh_api AABBTree3D create_aabb_tree< 3 >(

src/geode/mesh/helpers/aabb_surface_helpers.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,10 @@ namespace geode
6060
}
6161

6262
template < index_t dimension >
63-
std::tuple< double, Point< dimension > >
64-
DistanceToTriangle< dimension >::operator()(
65-
const Point< dimension >& query, index_t cur_box ) const
63+
double DistanceToTriangle< dimension >::operator()(
64+
const Point< dimension >& query, index_t cur_box ) const
6665
{
67-
return point_triangle_distance( query, mesh_.triangle( cur_box ) );
66+
return std::get< 0 >( point_triangle_distance( query, mesh_.triangle( cur_box ) ));
6867
}
6968

7069
template opengeode_mesh_api AABBTree2D create_aabb_tree< 2 >(

src/geode/mesh/helpers/hausdorff_distance.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ namespace
4949
const auto& query = mesh_A.point( v );
5050
const auto closest_element =
5151
mesh_B_tree.closest_element_box( query, distance_action );
52-
const auto distance = std::get< 2 >( closest_element );
52+
const auto distance = std::get< 1 >( closest_element );
5353
if( distance > min_dist )
5454
{
5555
min_dist = distance;

tests/geometry/test-aabb.cpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,16 +101,14 @@ class BoxAABBEvalDistance
101101
}
102102
~BoxAABBEvalDistance() = default;
103103

104-
std::tuple< double, geode::Point< dimension > > operator()(
105-
const geode::Point< dimension >& query,
104+
double operator()( const geode::Point< dimension >& query,
106105
geode::index_t current_element_box ) const
107106
{
108107
const auto box_center =
109108
( bounding_boxes_[current_element_box].min()
110109
+ bounding_boxes_[current_element_box].max() )
111110
/ 2.;
112-
return std::make_tuple(
113-
geode::point_point_distance( box_center, query ), box_center );
111+
return geode::point_point_distance( box_center, query );
114112
}
115113

116114
private:
@@ -143,16 +141,12 @@ void test_nearest_neighbor_search()
143141
query.set_value( 0, i + box_size / 2. );
144142
query.set_value( 1, j + box_size / 2. );
145143
geode::index_t box_id;
146-
geode::Point< dimension > nearest_point;
147144
double distance;
148-
std::tie( box_id, nearest_point, distance ) =
145+
std::tie( box_id, distance ) =
149146
aabb.closest_element_box( query, disteval );
150147

151148
OPENGEODE_EXCEPTION( box_id == global_box_index( i, j, nb_boxes ),
152149
"[Test] Nearest box to point AABB - Wrong nearest box index" );
153-
OPENGEODE_EXCEPTION( nearest_point == box_center,
154-
"[Test] Nearest box to point AABB - Wrong nearest box "
155-
"center " );
156150
OPENGEODE_EXCEPTION(
157151
distance == geode::point_point_distance( box_center, query ),
158152
"[Test] Nearest box to point AABB - Wrong distance to nearest "

0 commit comments

Comments
 (0)