19{
21
22
23 for (std::size_t k(0); k < 3; ++k)
24 {
25 max_point[k] += std::abs(max_point[k]) * 1e-6;
26 if (std::abs(max_point[k]) < std::numeric_limits<double>::epsilon())
27 {
28 max_point[k] = (max_point[k] - min_point[k]) * (1.0 + 1e-6);
29 }
30 }
31
32 Eigen::Vector3d delta = max_point - min_point;
33
34 if (delta[0] < std::numeric_limits<double>::epsilon())
35 {
36 const double max_delta(std::max(delta[1], delta[2]));
37 min_point[0] -= max_delta * 0.5e-3;
38 max_point[0] += max_delta * 0.5e-3;
39 delta[0] = max_point[0] - min_point[0];
40 }
41
42 if (delta[1] < std::numeric_limits<double>::epsilon())
43 {
44 const double max_delta(std::max(delta[0], delta[2]));
45 min_point[1] -= max_delta * 0.5e-3;
46 max_point[1] += max_delta * 0.5e-3;
47 delta[1] = max_point[1] - min_point[1];
48 }
49
50 if (delta[2] < std::numeric_limits<double>::epsilon())
51 {
52 const double max_delta(std::max(delta[0], delta[1]));
53 min_point[2] -= max_delta * 0.5e-3;
54 max_point[2] += max_delta * 0.5e-3;
55 delta[2] = max_point[2] - min_point[2];
56 }
57
60
61 const std::size_t n_tris(sfc->getNumberOfTriangles());
62 const std::size_t n_tris_per_cell(5);
63
64 Eigen::Matrix<bool, 3, 1> dim =
65 delta.array() >= std::numeric_limits<double>::epsilon();
66
67
68
69
70
71
72
73
74 auto sc_ceil = [](double v)
75 { return static_cast<std::size_t>(std::ceil(v)); };
76 switch (dim.count())
77 {
78 case 3:
80 sc_ceil(std::cbrt(n_tris * delta[0] * delta[0] /
81 (n_tris_per_cell * delta[1] * delta[2])));
83 sc_ceil(
_n_steps[0] * std::min(delta[1] / delta[0], 100.0));
85 sc_ceil(
_n_steps[0] * std::min(delta[2] / delta[0], 100.0));
86 break;
87 case 2:
88 if (dim[0] && dim[2])
89 {
90 _n_steps[0] = sc_ceil(std::sqrt(n_tris * delta[0] /
91 (n_tris_per_cell * delta[2])));
93 }
94 else if (dim[0] && dim[1])
95 {
96 _n_steps[0] = sc_ceil(std::sqrt(n_tris * delta[0] /
97 (n_tris_per_cell * delta[1])));
99 }
100 else if (dim[1] && dim[2])
101 {
102 _n_steps[1] = sc_ceil(std::sqrt(n_tris * delta[1] /
103 (n_tris_per_cell * delta[2])));
105 sc_ceil(n_tris * delta[2] / (n_tris_per_cell * delta[1]));
106 }
107 break;
108 case 1:
109 for (std::size_t k(0); k < 3; ++k)
110 {
111 if (dim[k])
112 {
114 sc_ceil(static_cast<double>(n_tris) / n_tris_per_cell);
115 }
116 }
117 }
118
119
120 for (std::size_t k(0); k < 3; k++)
121 {
123 if (delta[k] > std::numeric_limits<double>::epsilon())
124 {
126 }
127 else
128 {
130 }
131 }
132
135}
AABB(std::vector< PNT_TYPE * > const &pnts, std::vector< std::size_t > const &ids)
MinMaxPoints getMinMaxPoints() const
bool update(PNT_TYPE const &p)
void sortTrianglesInGridCells(GeoLib::Surface const *const sfc)
std::vector< std::vector< GeoLib::Triangle const * > > _triangles_in_grid_box
std::array< std::size_t, 3 > _n_steps
std::array< double, 3 > _inverse_step_sizes
std::array< double, 3 > _step_sizes