8 Eigen::Vector3d ll, Eigen::Vector3d ur,
double eps)
11 const double dx(ur[0] - ll[0]);
12 const double dy(ur[1] - ll[1]);
13 const double dz(ur[2] - ll[2]);
14 if (dx >= dy && dx >= dz)
16 ll[1] -= (dx - dy) / 2.0;
17 ur[1] += (dx - dy) / 2.0;
18 ll[2] -= (dx - dz) / 2.0;
19 ur[2] += (dx - dz) / 2.0;
23 if (dy >= dx && dy >= dz)
25 ll[0] -= (dy - dx) / 2.0;
26 ur[0] += (dy - dx) / 2.0;
27 ll[2] -= (dy - dz) / 2.0;
28 ur[2] += (dy - dz) / 2.0;
32 ll[0] -= (dz - dx) / 2.0;
33 ur[0] += (dz - dx) / 2.0;
34 ll[1] -= (dz - dy) / 2.0;
35 ur[1] += (dz - dy) / 2.0;
40 eps = std::numeric_limits<double>::epsilon();
42 for (std::size_t k(0); k < 3; ++k)
44 if (ur[k] - ll[k] > 0.0)
46 ur[k] += (ur[k] - ll[k]) * 1e-6;
53 Eigen::Vector3d lower_left{ll[0], ll[1], ll[2]};
54 Eigen::Vector3d upper_right{ur[0], ur[1], ur[2]};
71 std::vector<POINT*> query_pnts;
72 Eigen::Vector3d
const min = pnt->asEigenVector3d().array() -
_eps;
73 Eigen::Vector3d
const max = {
74 std::abs(((*pnt)[0] +
_eps) - (*pnt)[0]) > 0.0
76 : std::nextafter((*pnt)[0],
77 std::numeric_limits<double>::infinity()),
78 std::abs(((*pnt)[1] +
_eps) - (*pnt)[1]) > 0.0
80 : std::nextafter((*pnt)[1],
81 std::numeric_limits<double>::infinity()),
82 std::abs(((*pnt)[2] +
_eps) - (*pnt)[2]) > 0.0
84 : std::nextafter((*pnt)[2],
85 std::numeric_limits<double>::infinity())};
88 std::find_if(query_pnts.begin(), query_pnts.end(),
89 [pnt,
this](
auto const* p)
91 return (p->asEigenVector3d() - pnt->asEigenVector3d())
92 .squaredNorm() < _eps * _eps;
94 if (it != query_pnts.end())
112 if (c->addPoint_(pnt, ret_pnt))
116 if (ret_pnt !=
nullptr)
125 if (
_pnts.size() < MAX_POINTS)
127 _pnts.push_back(pnt);
155 T
const& min, T
const& max, std::vector<POINT*>& pnts)
const
157 if (
_ur[0] < min[0] ||
_ur[1] < min[1] ||
_ur[2] < min[2])
162 if (max[0] <
_ll[0] || max[1] <
_ll[1] || max[2] <
_ll[2])
169 std::copy_if(
_pnts.begin(),
_pnts.end(), std::back_inserter(pnts),
170 [&min, &max](
auto const* p)
172 return (min[0] <= (*p)[0] && (*p)[0] < max[0] &&
173 min[1] <= (*p)[1] && (*p)[1] < max[1] &&
174 min[2] <= (*p)[2] && (*p)[2] < max[2]);
179 for (std::size_t k(0); k < 8; k++)
181 _children[k]->getPointsInRange_(min, max, pnts);