diff --git a/GeoLib/Grid.h b/GeoLib/Grid.h index 8a13c02672cb292b4dfa03f57c127b3a34450cbd..14614c4dc6e3ed84c5f008712ca6b86546af079d 100644 --- a/GeoLib/Grid.h +++ b/GeoLib/Grid.h @@ -179,7 +179,6 @@ private: std::array<std::size_t,3> _n_steps; std::array<double, 3> _step_sizes; - std::array<double, 3> _inverse_step_sizes; /** * This is an array that stores pointers to POINT objects. */ @@ -189,10 +188,11 @@ private: template <typename POINT> template <typename InputIterator> Grid<POINT>::Grid(InputIterator first, InputIterator last, - std::size_t max_num_per_grid_cell) - : GeoLib::AABB(first, last), _n_steps({{1,1,1}}), - _step_sizes({{0.0,0.0,0.0}}), _inverse_step_sizes({{0.0,0.0,0.0}}), - _grid_cell_nodes_map(nullptr) + std::size_t max_num_per_grid_cell) + : GeoLib::AABB(first, last), + _n_steps({{1, 1, 1}}), + _step_sizes({{0.0, 0.0, 0.0}}), + _grid_cell_nodes_map(nullptr) { auto const n_pnts(std::distance(first,last)); @@ -216,7 +216,6 @@ Grid<POINT>::Grid(InputIterator first, InputIterator last, delta[k] = std::numeric_limits<double>::epsilon(); } _step_sizes[k] = delta[k] / _n_steps[k]; - _inverse_step_sizes[k] = 1.0 / _step_sizes[k]; } // fill the grid vectors @@ -377,16 +376,24 @@ template <typename T> std::array<std::size_t,3> Grid<POINT>::getGridCoords(T const& pnt) const { std::array<std::size_t,3> coords; - for (std::size_t k(0); k<3; k++) { - if (pnt[k] < _min_pnt[k]) { + for (std::size_t k(0); k < 3; k++) + { + if (pnt[k] < _min_pnt[k]) + { coords[k] = 0; - } else { - if (pnt[k] > _max_pnt[k]) { - coords[k] = _n_steps[k]-1; - } else { + } + else + { + if (pnt[k] >= _max_pnt[k]) + { + coords[k] = _n_steps[k] - 1; + } + else + { coords[k] = static_cast<std::size_t>( - std::floor((pnt[k] - _min_pnt[k])) * - _inverse_step_sizes[k]); + std::floor((pnt[k] - _min_pnt[k])) / + std::nextafter(_step_sizes[k], + std::numeric_limits<double>::max())); } } }