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