20 auto [min_point, max_point] = getMinMaxPoints();
23 for (std::size_t k(0); k < 3; ++k)
25 max_point[k] += std::abs(max_point[k]) * 1e-6;
26 if (std::abs(max_point[k]) < std::numeric_limits<double>::epsilon())
28 max_point[k] = (max_point[k] - min_point[k]) * (1.0 + 1e-6);
32 Eigen::Vector3d delta = max_point - min_point;
34 if (delta[0] < std::numeric_limits<double>::epsilon())
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];
42 if (delta[1] < std::numeric_limits<double>::epsilon())
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];
50 if (delta[2] < std::numeric_limits<double>::epsilon())
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];
61 const std::size_t n_tris(sfc->getNumberOfTriangles());
62 const std::size_t n_tris_per_cell(5);
64 Eigen::Matrix<bool, 3, 1> dim =
65 delta.array() >= std::numeric_limits<double>::epsilon();
74 auto sc_ceil = [](
double v)
75 {
return static_cast<std::size_t
>(std::ceil(v)); };
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));
90 _n_steps[0] = sc_ceil(std::sqrt(n_tris * delta[0] /
91 (n_tris_per_cell * delta[2])));
92 _n_steps[2] = sc_ceil(_n_steps[0] * delta[2] / delta[0]);
94 else if (dim[0] && dim[1])
96 _n_steps[0] = sc_ceil(std::sqrt(n_tris * delta[0] /
97 (n_tris_per_cell * delta[1])));
98 _n_steps[1] = sc_ceil(_n_steps[0] * delta[1] / delta[0]);
100 else if (dim[1] && dim[2])
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]));
109 for (std::size_t k(0); k < 3; ++k)
114 sc_ceil(
static_cast<double>(n_tris) / n_tris_per_cell);
120 for (std::size_t k(0); k < 3; k++)
122 _step_sizes[k] = delta[k] / _n_steps[k];
123 if (delta[k] > std::numeric_limits<double>::epsilon())
125 _inverse_step_sizes[k] = 1.0 / _step_sizes[k];
129 _inverse_step_sizes[k] = 0;
133 _triangles_in_grid_box.resize(_n_steps[0] * _n_steps[1] * _n_steps[2]);
134 sortTrianglesInGridCells(sfc);
143 Point const& p0(*((*sfc)[l]->getPoint(0)));
144 Point const& p1(*((*sfc)[l]->getPoint(1)));
145 Point const& p2(*((*sfc)[l]->getPoint(2)));
148 "Sorting triangle {:d} [({:f},{:f},{:f}), ({:f},{:f},{:f}), "
149 "({:f},{:f},{:f}) into grid. Bounding box is [{:f}, {:f}] x "
150 "[{:f}, {:f}] x [{:f}, {:f}].",
151 l, p0[0], p0[1], p0[2], p1[0], p1[1], p1[2], p2[0], p2[1],
152 p2[2], min[0], max[0], min[1], max[1], min[2], max[2]);
160 std::optional<std::array<std::size_t, 3>
const> c_p0(
166 std::optional<std::array<std::size_t, 3>
const> c_p1(
172 std::optional<std::array<std::size_t, 3>
const> c_p2(
180 std::size_t
const i_min(
181 std::min(std::min((*c_p0)[0], (*c_p1)[0]), (*c_p2)[0]));
182 std::size_t
const i_max(
183 std::max(std::max((*c_p0)[0], (*c_p1)[0]), (*c_p2)[0]));
184 std::size_t
const j_min(
185 std::min(std::min((*c_p0)[1], (*c_p1)[1]), (*c_p2)[1]));
186 std::size_t
const j_max(
187 std::max(std::max((*c_p0)[1], (*c_p1)[1]), (*c_p2)[1]));
188 std::size_t
const k_min(
189 std::min(std::min((*c_p0)[2], (*c_p1)[2]), (*c_p2)[2]));
190 std::size_t
const k_max(
191 std::max(std::max((*c_p0)[2], (*c_p1)[2]), (*c_p2)[2]));
196 for (std::size_t i(i_min); i <= i_max; i++)
198 for (std::size_t j(j_min); j <= j_max; j++)
200 for (std::size_t k(k_min); k <= k_max; k++)
203 .push_back(triangle);