81 class Derived,
typename num_t = float,
102 return *
static_cast<const Derived*
>(
this);
105 inline Derived&
derived() {
return *
static_cast<Derived*
>(
this); }
137 float x0,
float y0,
float& out_x,
float& out_y,
138 float& out_dist_sqr)
const
145 const size_t knn = 1;
148 resultSet.
init(&ret_index, &out_dist_sqr);
150 const std::array<num_t, 2> query_point{{x0, y0}};
155 out_x =
derived().kdtree_get_pt(ret_index, 0);
156 out_y =
derived().kdtree_get_pt(ret_index, 1);
164 float x0,
float y0,
float& out_dist_sqr)
const
171 const size_t knn = 1;
174 resultSet.
init(&ret_index, &out_dist_sqr);
176 const std::array<num_t, 2> query_point{{x0, y0}};
201 float closerx, closery, closer_dist;
232 float x0,
float y0,
float& out_x1,
float& out_y1,
float& out_x2,
233 float& out_y2,
float& out_dist_sqr1,
float& out_dist_sqr2)
const
240 const size_t knn = 2;
241 size_t ret_indexes[2];
244 resultSet.
init(&ret_indexes[0], &ret_sqdist[0]);
246 const std::array<num_t, 2> query_point{{x0, y0}};
251 out_x1 =
derived().kdtree_get_pt(ret_indexes[0], 0);
252 out_y1 =
derived().kdtree_get_pt(ret_indexes[0], 1);
253 out_dist_sqr1 = ret_sqdist[0];
255 out_x2 =
derived().kdtree_get_pt(ret_indexes[1], 0);
256 out_y2 =
derived().kdtree_get_pt(ret_indexes[1], 1);
257 out_dist_sqr2 = ret_sqdist[0];
264 float& outDistSqr1,
float& outDistSqr2)
const
266 float dmy1, dmy2, dmy3, dmy4;
268 p0.
x, p0.
y, dmy1, dmy2, dmy3, dmy4, outDistSqr1, outDistSqr2);
269 pOut1.
x =
static_cast<double>(dmy1);
270 pOut1.
y =
static_cast<double>(dmy2);
271 pOut2.
x =
static_cast<double>(dmy3);
272 pOut2.
y =
static_cast<double>(dmy4);
297 float x0,
float y0,
size_t knn, std::vector<float>& out_x,
298 std::vector<float>& out_y, std::vector<float>& out_dist_sqr)
const
305 std::vector<size_t> ret_indexes(knn);
308 out_dist_sqr.resize(knn);
311 resultSet.
init(&ret_indexes[0], &out_dist_sqr[0]);
313 const std::array<num_t, 2> query_point{{x0, y0}};
317 for (
size_t i = 0; i < knn; i++)
319 out_x[i] =
derived().kdtree_get_pt(ret_indexes[i], 0);
320 out_y[i] =
derived().kdtree_get_pt(ret_indexes[i], 1);
327 const TPoint2D& p0,
size_t N, std::vector<TPoint2D>& pOut,
328 std::vector<float>& outDistSqr)
const
330 std::vector<float> dmy1, dmy2;
332 d2f(p0.
x),
d2f(p0.
y), N, dmy1, dmy2, outDistSqr);
333 pOut.resize(dmy1.size());
334 for (
size_t i = 0; i < dmy1.size(); i++)
336 pOut[i].x =
static_cast<double>(dmy1[i]);
337 pOut[i].y =
static_cast<double>(dmy2[i]);
359 float x0,
float y0,
size_t knn, std::vector<size_t>& out_idx,
360 std::vector<float>& out_dist_sqr)
const
368 out_dist_sqr.resize(knn);
370 resultSet.
init(&out_idx[0], &out_dist_sqr[0]);
372 const std::array<num_t, 2> query_point{{x0, y0}};
379 const TPoint2D& p0,
size_t N, std::vector<size_t>& outIdx,
380 std::vector<float>& outDistSqr)
const
383 d2f(p0.
x),
d2f(p0.
y), N, outIdx, outDistSqr);
406 float x0,
float y0,
float z0,
float& out_x,
float& out_y,
float& out_z,
407 float& out_dist_sqr)
const
414 const size_t knn = 1;
417 resultSet.
init(&ret_index, &out_dist_sqr);
419 const std::array<num_t, 3> query_point{{x0, y0, z0}};
424 out_x =
derived().kdtree_get_pt(ret_index, 0);
425 out_y =
derived().kdtree_get_pt(ret_index, 1);
426 out_z =
derived().kdtree_get_pt(ret_index, 2);
434 float x0,
float y0,
float z0,
float& out_dist_sqr)
const
441 const size_t knn = 1;
444 resultSet.
init(&ret_index, &out_dist_sqr);
446 const std::array<num_t, 3> query_point{{x0, y0, z0}};
458 float dmy1, dmy2, dmy3;
460 d2f(p0.
x),
d2f(p0.
y),
d2f(p0.
z), dmy1, dmy2, dmy3, outDistSqr);
461 pOut.
x =
static_cast<double>(dmy1);
462 pOut.
y =
static_cast<double>(dmy2);
463 pOut.
z =
static_cast<double>(dmy3);
490 float x0,
float y0,
float z0,
size_t knn, std::vector<float>& out_x,
491 std::vector<float>& out_y, std::vector<float>& out_z,
492 std::vector<float>& out_dist_sqr)
const
499 std::vector<size_t> ret_indexes(knn);
503 out_dist_sqr.resize(knn);
506 resultSet.
init(&ret_indexes[0], &out_dist_sqr[0]);
508 const std::array<num_t, 3> query_point{{x0, y0, z0}};
512 for (
size_t i = 0; i < knn; i++)
514 out_x[i] =
derived().kdtree_get_pt(ret_indexes[i], 0);
515 out_y[i] =
derived().kdtree_get_pt(ret_indexes[i], 1);
516 out_z[i] =
derived().kdtree_get_pt(ret_indexes[i], 2);
545 float x0,
float y0,
float z0,
size_t knn, std::vector<float>& out_x,
546 std::vector<float>& out_y, std::vector<float>& out_z,
547 std::vector<size_t>& out_idx, std::vector<float>& out_dist_sqr)
const
558 out_dist_sqr.resize(knn);
561 resultSet.
init(&out_idx[0], &out_dist_sqr[0]);
563 const std::array<num_t, 3> query_point{{x0, y0, z0}};
567 for (
size_t i = 0; i < knn; i++)
569 out_x[i] =
derived().kdtree_get_pt(out_idx[i], 0);
570 out_y[i] =
derived().kdtree_get_pt(out_idx[i], 1);
571 out_z[i] =
derived().kdtree_get_pt(out_idx[i], 2);
577 const TPoint3D& p0,
size_t N, std::vector<TPoint3D>& pOut,
578 std::vector<float>& outDistSqr)
const
580 std::vector<float> dmy1, dmy2, dmy3;
582 d2f(p0.
x),
d2f(p0.
y),
d2f(p0.
z), N, dmy1, dmy2, dmy3, outDistSqr);
583 pOut.resize(dmy1.size());
584 for (
size_t i = 0; i < dmy1.size(); i++)
586 pOut[i].x =
static_cast<double>(dmy1[i]);
587 pOut[i].y =
static_cast<double>(dmy2[i]);
588 pOut[i].z =
static_cast<double>(dmy3[i]);
610 const num_t x0,
const num_t y0,
const num_t z0,
611 const num_t maxRadiusSqr,
612 std::vector<std::pair<size_t, num_t>>& out_indices_dist)
const
616 out_indices_dist.clear();
619 const num_t xyz[3] = {x0, y0, z0};
621 &xyz[0], maxRadiusSqr, out_indices_dist,
624 return out_indices_dist.size();
645 const num_t x0,
const num_t y0,
const num_t maxRadiusSqr,
646 std::vector<std::pair<size_t, num_t>>& out_indices_dist)
const
650 out_indices_dist.clear();
653 const num_t xyz[2] = {x0, y0};
655 &xyz[0], maxRadiusSqr, out_indices_dist,
658 return out_indices_dist.size();
680 float x0,
float y0,
float z0,
size_t knn, std::vector<size_t>& out_idx,
681 std::vector<float>& out_dist_sqr)
const
689 out_dist_sqr.resize(knn);
691 resultSet.
init(&out_idx[0], &out_dist_sqr[0]);
693 const std::array<num_t, 3> query_point{{x0, y0, z0}};
700 const TPoint3D& p0,
size_t N, std::vector<size_t>& outIdx,
701 std::vector<float>& outDistSqr)
const
704 d2f(p0.
x),
d2f(p0.
y),
d2f(p0.
z), N, outIdx, outDistSqr);
723 template <
int _DIM = -1>
736 if (&o !=
this)
clear();
746 std::unique_ptr<kdtree_index_t>
index;
779 const size_t N =
derived().kdtree_get_point_count();
813 const size_t N =
derived().kdtree_get_point_count();