Skip to content

Commit dc7a442

Browse files
Merge pull request #1132 from Geode-solutions/fix/move-assign-light-grid
fix(LightRegularGrid): add move assign
2 parents 6baebc3 + 328a283 commit dc7a442

File tree

5 files changed

+36
-10
lines changed

5 files changed

+36
-10
lines changed

include/geode/geometry/bounding_box.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ namespace geode
113113
[[nodiscard]] std::tuple< local_index_t, double >
114114
largest_length() const;
115115

116+
[[nodiscard]] std::string string() const;
117+
116118
private:
117119
Point< dimension > min_;
118120
Point< dimension > max_;

include/geode/mesh/core/light_regular_grid.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ namespace geode
5555
std::array< index_t, dimension > cells_number,
5656
std::array< Vector< dimension >, dimension > directions );
5757
LightRegularGrid( LightRegularGrid&& other ) noexcept;
58+
LightRegularGrid& operator=( LightRegularGrid&& other ) noexcept;
5859
~LightRegularGrid();
5960

6061
[[nodiscard]] static std::string_view native_extension_static()

src/geode/geometry/bounding_box.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,13 @@ namespace geode
501501
return -inner_distance;
502502
}
503503

504+
template < index_t dimension >
505+
std::string BoundingBox< dimension >::string() const
506+
{
507+
return absl::StrCat(
508+
"(min: ", min_.string(), ", max: ", max_.string(), ")" );
509+
}
510+
504511
template class opengeode_geometry_api BoundingBox< 1 >;
505512
template class opengeode_geometry_api BoundingBox< 2 >;
506513
template class opengeode_geometry_api BoundingBox< 3 >;

src/geode/mesh/core/light_regular_grid.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ namespace geode
111111
LightRegularGrid< dimension >::LightRegularGrid(
112112
LightRegularGrid&& ) noexcept = default;
113113

114+
template < index_t dimension >
115+
auto LightRegularGrid< dimension >::operator=( LightRegularGrid&& ) noexcept
116+
-> LightRegularGrid& = default;
117+
114118
template < index_t dimension >
115119
LightRegularGrid< dimension >::~LightRegularGrid() = default;
116120

src/geode/mesh/helpers/build_grid.cpp

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,33 +34,45 @@ namespace geode
3434
double target_cell_length,
3535
index_t max_nb_cells )
3636
{
37-
const auto diagonal = bbox.max() - bbox.min();
37+
const auto diagonal = bbox.diagonal();
3838
double numerator{ 1 };
39+
index_t nb_grid_extensions{ 0 };
3940
for( const auto d : LRange{ dimension } )
4041
{
42+
if( diagonal.value( d ) < GLOBAL_EPSILON )
43+
{
44+
continue;
45+
}
4146
numerator *= diagonal.value( d );
47+
nb_grid_extensions++;
4248
}
49+
OPENGEODE_EXCEPTION( nb_grid_extensions != 0,
50+
"[build_grid_from_bbox_target_length_and_maximum_cell_number] "
51+
"Invalid bbox: ",
52+
bbox.string() );
4353
const auto min_cell_length =
44-
std::pow( numerator / max_nb_cells, 1. / dimension );
54+
std::pow( numerator / max_nb_cells, 1. / nb_grid_extensions );
4555
const auto target_is_ok = target_cell_length > min_cell_length;
46-
auto cell_length = std::max( min_cell_length, target_cell_length );
56+
const auto cell_length =
57+
std::max( min_cell_length, target_cell_length );
4758
std::array< index_t, dimension > cell_numbers;
4859
std::array< double, dimension > cell_lengths;
4960
for( const auto d : LRange{ dimension } )
5061
{
5162
if( target_is_ok )
5263
{
53-
cell_numbers[d] = std::max( static_cast< index_t >( 1 ),
54-
static_cast< index_t >(
55-
std::ceil( diagonal.value( d ) / cell_length ) ) );
64+
cell_numbers[d] = std::max(
65+
1u, static_cast< index_t >(
66+
std::ceil( diagonal.value( d ) / cell_length ) ) );
5667
}
5768
else
5869
{
59-
cell_numbers[d] = std::max( static_cast< index_t >( 1 ),
60-
static_cast< index_t >(
61-
std::floor( diagonal.value( d ) / cell_length ) ) );
70+
cell_numbers[d] = std::max(
71+
1u, static_cast< index_t >(
72+
std::floor( diagonal.value( d ) / cell_length ) ) );
6273
}
63-
cell_lengths[d] = diagonal.value( d ) / cell_numbers[d];
74+
cell_lengths[d] = std::max(
75+
2 * GLOBAL_EPSILON, diagonal.value( d ) / cell_numbers[d] );
6476
}
6577
return { bbox.min(), std::move( cell_numbers ),
6678
std::move( cell_lengths ) };

0 commit comments

Comments
 (0)