From b8411c4687378e57a02702b7aa58d2dbd1ba5916 Mon Sep 17 00:00:00 2001 From: Thomas Fischer <thomas.fischer@ufz.de> Date: Thu, 8 May 2014 06:56:22 +0200 Subject: [PATCH] [GeoLib::Grid] Refactored initNumberOfSteps(). --- GeoLib/Grid.h | 107 ++++++++++++++++++++++++++------------------------ 1 file changed, 56 insertions(+), 51 deletions(-) diff --git a/GeoLib/Grid.h b/GeoLib/Grid.h index 57da490dcdf..626e4456af5 100644 --- a/GeoLib/Grid.h +++ b/GeoLib/Grid.h @@ -74,57 +74,7 @@ public: delta[k] = this->_max_pnt[k] - this->_min_pnt[k]; } - // *** condition: n_pnts / (_n_steps[0] * _n_steps[1] * _n_steps[2]) < max_num_per_grid_cell - // *** with _n_steps[1] = _n_steps[0] * delta[1]/delta[0], _n_steps[2] = _n_steps[0] * delta[2]/delta[0] - const double eps(std::numeric_limits<double>::epsilon()); - if (fabs(delta[0]) < eps) { // dx == 0 - if(fabs(delta[1]) < eps) { // dy == 0 - if(fabs(delta[2]) < eps) { // degenerated case, dx == 0, dy == 0, dz == 0 - WARN("Grid constructor: Bounding volume [%f,%f] x [%f,%f] x [%f,%f] too small.", - this->_min_pnt[0], this->_max_pnt[0], - this->_min_pnt[1], this->_max_pnt[1], - this->_min_pnt[2], this->_max_pnt[2] - ); - } else { // 1d case: dx == 0, dy == 0, dz != 0 - _n_steps[0] = 1; - _n_steps[1] = 1; - _n_steps[2] = static_cast<std::size_t> (ceil(n_pnts / (double) max_num_per_grid_cell)); - } - } else { // dy != 0 - if(fabs(delta[2]) < eps) { // 1d case: dx == 0, dy != 0, dz == 0 - _n_steps[0] = 1; - _n_steps[1] = static_cast<std::size_t> (ceil(n_pnts / (double) max_num_per_grid_cell)); - _n_steps[2] = 1; - } else { // 2d case: dx == 0, dy != 0, dz != 0 - _n_steps[0] = 1; - _n_steps[1] = static_cast<std::size_t> (ceil(sqrt(n_pnts * delta[1] / (max_num_per_grid_cell * delta[2])))); - _n_steps[2] = static_cast<std::size_t> (ceil(n_pnts / (double) max_num_per_grid_cell)); - } - } - } else { // dx != 0 - if(fabs(delta[1]) < eps) { // dy == 0 - if(fabs(delta[2]) < eps) { // 1d case: dx != 0, dy == 0, dz == 0 - _n_steps[0] = static_cast<std::size_t> (ceil(n_pnts / (double) max_num_per_grid_cell)); - _n_steps[1] = 1; - _n_steps[2] = 1; - } else { // 2d case: dx != 0, dy == 0, dz != 0 - _n_steps[0] = static_cast<std::size_t> (ceil(sqrt(n_pnts * delta[0] / (max_num_per_grid_cell * delta[2])))); - _n_steps[1] = 1; - _n_steps[2] = static_cast<std::size_t> (ceil(_n_steps[0] * delta[2] / delta[0])); - } - } else { // dy != 0 - if(fabs(delta[2]) < eps) { // 2d case: dx != 0, dy != 0, dz == 0 - _n_steps[0] = static_cast<std::size_t> (ceil(sqrt(n_pnts * delta[0] / (max_num_per_grid_cell * delta[1])))); - _n_steps[1] = static_cast<std::size_t> (ceil(_n_steps[0] * delta[1] / delta[0])); - _n_steps[2] = 1; - } else { // 3d case: dx != 0, dy != 0, dz != 0 - _n_steps[0] = static_cast<std::size_t> (ceil(pow(n_pnts * delta[0] * delta[0] - / (max_num_per_grid_cell * delta[1] * delta[2]), 1. / 3.))); - _n_steps[1] = std::max(static_cast<std::size_t>(1), std::min(static_cast<std::size_t> (ceil(_n_steps[0] * delta[1] / delta[0])), static_cast<std::size_t>(100))); - _n_steps[2] = std::max(static_cast<std::size_t>(1), std::min(static_cast<std::size_t> (ceil(_n_steps[0] * delta[2] / delta[0])), static_cast<std::size_t>(100))); - } - } - } + initNumberOfSteps(max_num_per_grid_cell, n_pnts, delta); const std::size_t n_plane(_n_steps[0] * _n_steps[1]); _grid_cell_nodes_map = new std::vector<POINT*>[n_plane * _n_steps[2]]; @@ -301,6 +251,61 @@ public: #endif private: + void initNumberOfSteps(std::size_t max_num_per_grid_cell, std::size_t n_pnts, double delta[3]) + { + // *** condition: n_pnts / (_n_steps[0] * _n_steps[1] * _n_steps[2]) < max_num_per_grid_cell + // *** with _n_steps[1] = _n_steps[0] * delta[1]/delta[0], _n_steps[2] = _n_steps[0] * delta[2]/delta[0] + const double eps(std::numeric_limits<double>::epsilon()); + if (fabs(delta[0]) < eps) { // dx == 0 + if(fabs(delta[1]) < eps) { // dy == 0 + if(fabs(delta[2]) < eps) { // degenerated case, dx == 0, dy == 0, dz == 0 + WARN("Grid constructor: Bounding volume [%f,%f] x [%f,%f] x [%f,%f] too small.", + this->_min_pnt[0], this->_max_pnt[0], + this->_min_pnt[1], this->_max_pnt[1], + this->_min_pnt[2], this->_max_pnt[2] + ); + } else { // 1d case: dx == 0, dy == 0, dz != 0 + _n_steps[0] = 1; + _n_steps[1] = 1; + _n_steps[2] = static_cast<std::size_t> (ceil(n_pnts / (double) max_num_per_grid_cell)); + } + } else { // dy != 0 + if(fabs(delta[2]) < eps) { // 1d case: dx == 0, dy != 0, dz == 0 + _n_steps[0] = 1; + _n_steps[1] = static_cast<std::size_t> (ceil(n_pnts / (double) max_num_per_grid_cell)); + _n_steps[2] = 1; + } else { // 2d case: dx == 0, dy != 0, dz != 0 + _n_steps[0] = 1; + _n_steps[1] = static_cast<std::size_t> (ceil(sqrt(n_pnts * delta[1] / (max_num_per_grid_cell * delta[2])))); + _n_steps[2] = static_cast<std::size_t> (ceil(n_pnts / (double) max_num_per_grid_cell)); + } + } + } else { // dx != 0 + if(fabs(delta[1]) < eps) { // dy == 0 + if(fabs(delta[2]) < eps) { // 1d case: dx != 0, dy == 0, dz == 0 + _n_steps[0] = static_cast<std::size_t> (ceil(n_pnts / (double) max_num_per_grid_cell)); + _n_steps[1] = 1; + _n_steps[2] = 1; + } else { // 2d case: dx != 0, dy == 0, dz != 0 + _n_steps[0] = static_cast<std::size_t> (ceil(sqrt(n_pnts * delta[0] / (max_num_per_grid_cell * delta[2])))); + _n_steps[1] = 1; + _n_steps[2] = static_cast<std::size_t> (ceil(_n_steps[0] * delta[2] / delta[0])); + } + } else { // dy != 0 + if(fabs(delta[2]) < eps) { // 2d case: dx != 0, dy != 0, dz == 0 + _n_steps[0] = static_cast<std::size_t> (ceil(sqrt(n_pnts * delta[0] / (max_num_per_grid_cell * delta[1])))); + _n_steps[1] = static_cast<std::size_t> (ceil(_n_steps[0] * delta[1] / delta[0])); + _n_steps[2] = 1; + } else { // 3d case: dx != 0, dy != 0, dz != 0 + _n_steps[0] = static_cast<std::size_t> (ceil(pow(n_pnts * delta[0] * delta[0] + / (max_num_per_grid_cell * delta[1] * delta[2]), 1. / 3.))); + _n_steps[1] = std::max(static_cast<std::size_t>(1), std::min(static_cast<std::size_t> (ceil(_n_steps[0] * delta[1] / delta[0])), static_cast<std::size_t>(100))); + _n_steps[2] = std::max(static_cast<std::size_t>(1), std::min(static_cast<std::size_t> (ceil(_n_steps[0] * delta[2] / delta[0])), static_cast<std::size_t>(100))); + } + } + } + } + /** * Method calculates the grid cell coordinates for the given point pnt. If * the point is located outside of the bounding box the coordinates of the -- GitLab