@@ -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
103121namespace 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