Skip to content

Commit cf0296f

Browse files
Merge pull request #1003 from Geode-solutions/fix/bbox-large
fix(Bounding Box): add method to get the largest axe of the BBox
2 parents b78e8cf + 25ef9ca commit cf0296f

File tree

5 files changed

+54
-15
lines changed

5 files changed

+54
-15
lines changed

bindings/python/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
# This file is autogenerated by pip-compile with Python 3.10
33
# by the following command:
44
#
5-
# pip-compile bindings/python/requirements.in
5+
# pip-compile --pre bindings/python/requirements.in
66
#

bindings/python/src/geometry/bounding_box.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@
4848
.def( "max", &BoundingBox##dimension##D::max ) \
4949
.def( "center", &BoundingBox##dimension##D::center ) \
5050
.def( "diagonal", &BoundingBox##dimension##D::diagonal ) \
51-
.def( "smallest_length", &BoundingBox##dimension##D::smallest_length )
51+
.def( "smallest_length", &BoundingBox##dimension##D::smallest_length ) \
52+
.def( "largest_length", &BoundingBox##dimension##D::largest_length )
5253

5354
namespace geode
5455
{

include/geode/basic/algorithm.hpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,22 @@ namespace geode
103103
/*!
104104
* Modify the container by removing every duplicated values inside
105105
* @tparam Container Type of container.
106-
* @param[in] in container in which perform the search.
106+
* @param[in] container container in which perform the search.
107107
*/
108108
template < typename Container >
109-
void sort_unique( Container& in )
109+
void sort_unique( Container& container )
110110
{
111-
absl::c_sort( in );
112-
const auto last = std::unique( in.begin(), in.end() );
113-
in.erase( last, in.end() );
111+
absl::c_sort( container );
112+
const auto last = std::unique( container.begin(), container.end() );
113+
container.erase( last, container.end() );
114+
}
115+
116+
template < typename Container, typename Comparison >
117+
void sort_unique( Container& container, Comparison comp )
118+
{
119+
absl::c_sort( container, comp );
120+
const auto last = std::unique( container.begin(), container.end() );
121+
container.erase( last, container.end() );
114122
}
115123

116124
/*!

include/geode/geometry/bounding_box.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,9 @@ namespace geode
101101

102102
Vector< dimension > diagonal() const;
103103

104-
double smallest_length() const;
104+
std::tuple< local_index_t, double > smallest_length() const;
105+
106+
std::tuple< local_index_t, double > largest_length() const;
105107

106108
private:
107109
Point< dimension > min_;

src/geode/geometry/bounding_box.cpp

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,24 @@ namespace
9898
}
9999
return line.origin().value( 0 ) > box.max().value( 0 );
100100
}
101+
102+
template < geode::index_t dimension, typename Condition >
103+
std::tuple< geode::local_index_t, double > test_axes(
104+
const geode::Vector< dimension >& diagonal,
105+
double length,
106+
Condition predicate )
107+
{
108+
geode::local_index_t axis{ 0 };
109+
for( const auto i : geode::LRange{ dimension } )
110+
{
111+
if( predicate( diagonal.value( i ), length ) )
112+
{
113+
length = diagonal.value( i );
114+
axis = i;
115+
}
116+
}
117+
return std::make_tuple( axis, length );
118+
}
101119
} // namespace
102120

103121
namespace geode
@@ -408,15 +426,25 @@ namespace geode
408426
}
409427

410428
template < index_t dimension >
411-
double BoundingBox< dimension >::smallest_length() const
429+
std::tuple< local_index_t, double >
430+
BoundingBox< dimension >::smallest_length() const
412431
{
413432
auto length = std::numeric_limits< double >::max();
414-
const auto diag = diagonal();
415-
for( const auto i : LRange{ dimension } )
416-
{
417-
length = std::min( length, diag.value( i ) );
418-
}
419-
return length;
433+
return test_axes(
434+
diagonal(), length, []( double diagonal_value, double min_value ) {
435+
return diagonal_value < min_value;
436+
} );
437+
}
438+
439+
template < index_t dimension >
440+
std::tuple< local_index_t, double >
441+
BoundingBox< dimension >::largest_length() const
442+
{
443+
double length{ 0 };
444+
return test_axes(
445+
diagonal(), length, []( double diagonal_value, double max_value ) {
446+
return diagonal_value > max_value;
447+
} );
420448
}
421449

422450
template < index_t dimension >

0 commit comments

Comments
 (0)