28 #ifndef KDTreeCapable_H
29 #define KDTreeCapable_H
85 template <
class Derived,
typename num_t =
float,
typename metric_t = nanoflann::L2_Simple_Adaptor<num_t,Derived> >
100 inline const Derived&
derived()
const {
return *
static_cast<const Derived*
>(
this); }
102 inline Derived&
derived() {
return *
static_cast<Derived*
>(
this); }
148 const size_t knn = 1;
151 resultSet.
init(&ret_index, &out_dist_sqr );
158 out_x =
derived().kdtree_get_pt(ret_index,0);
159 out_y =
derived().kdtree_get_pt(ret_index,1);
169 float &out_dist_sqr )
const
175 const size_t knn = 1;
178 resultSet.
init(&ret_index, &out_dist_sqr );
203 float closerx,closery,closer_dist;
236 float &out_dist_sqr1,
237 float &out_dist_sqr2 )
const
243 const size_t knn = 2;
244 size_t ret_indexes[2];
247 resultSet.
init(&ret_indexes[0], &ret_sqdist[0] );
254 out_x1 =
derived().kdtree_get_pt(ret_indexes[0],0);
255 out_y1 =
derived().kdtree_get_pt(ret_indexes[0],1);
256 out_dist_sqr1 = ret_sqdist[0];
258 out_x2 =
derived().kdtree_get_pt(ret_indexes[1],0);
259 out_y2 =
derived().kdtree_get_pt(ret_indexes[1],1);
260 out_dist_sqr2 = ret_sqdist[0];
267 float dmy1,dmy2,dmy3,dmy4;
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 std::vector<float> &out_x,
298 std::vector<float> &out_y,
299 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] );
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 std::vector<float> dmy1,dmy2;
328 std::vector<size_t> res=
kdTreeNClosestPoint2D(static_cast<float>(p0.
x),static_cast<float>(p0.
y),N,dmy1,dmy2,outDistSqr);
329 pOut.resize(dmy1.size());
330 for (
size_t i=0;i<dmy1.size();i++) {
331 pOut[i].x=
static_cast<double>(dmy1[i]);
332 pOut[i].y=
static_cast<double>(dmy2[i]);
355 std::vector<size_t> &out_idx,
356 std::vector<float> &out_dist_sqr )
const
363 out_dist_sqr.resize(knn);
365 resultSet.
init(&out_idx[0], &out_dist_sqr[0] );
408 const size_t knn = 1;
411 resultSet.
init(&ret_index, &out_dist_sqr );
419 out_x =
derived().kdtree_get_pt(ret_index,0);
420 out_y =
derived().kdtree_get_pt(ret_index,1);
421 out_z =
derived().kdtree_get_pt(ret_index,2);
439 const size_t knn = 1;
442 resultSet.
init(&ret_index, &out_dist_sqr );
455 float dmy1,dmy2,dmy3;
456 size_t res=
kdTreeClosestPoint3D(static_cast<float>(p0.
x),static_cast<float>(p0.
y),static_cast<float>(p0.
z),dmy1,dmy2,dmy3,outDistSqr);
457 pOut.
x=
static_cast<double>(dmy1);
458 pOut.
y=
static_cast<double>(dmy2);
459 pOut.
z=
static_cast<double>(dmy3);
485 std::vector<float> &out_x,
486 std::vector<float> &out_y,
487 std::vector<float> &out_z,
488 std::vector<float> &out_dist_sqr )
const
494 std::vector<size_t> ret_indexes(knn);
498 out_dist_sqr.resize(knn);
501 resultSet.
init(&ret_indexes[0], &out_dist_sqr[0] );
508 for (
size_t i=0;i<knn;i++)
510 out_x[i] =
derived().kdtree_get_pt(ret_indexes[i],0);
511 out_y[i] =
derived().kdtree_get_pt(ret_indexes[i],1);
512 out_z[i] =
derived().kdtree_get_pt(ret_indexes[i],2);
518 std::vector<float> dmy1,dmy2,dmy3;
519 kdTreeNClosestPoint3D(static_cast<float>(p0.
x),static_cast<float>(p0.
y),static_cast<float>(p0.
z),N,dmy1,dmy2,dmy3,outDistSqr);
520 pOut.resize(dmy1.size());
521 for (
size_t i=0;i<dmy1.size();i++) {
522 pOut[i].x=
static_cast<double>(dmy1[i]);
523 pOut[i].y=
static_cast<double>(dmy2[i]);
524 pOut[i].z=
static_cast<double>(dmy3[i]);
544 const float x0,
const float y0,
const float z0,
545 const float maxRadius,
546 std::vector<std::pair<size_t,float> >& out_indices_dist )
const
550 out_indices_dist.clear();
553 const float xyz[3] = {x0,y0,z0};
556 return out_indices_dist.size();
575 const float x0,
const float y0,
576 const float maxRadius,
577 std::vector<std::pair<size_t,float> >& out_indices_dist )
const
581 out_indices_dist.clear();
584 const float xyz[2] = {x0,y0};
587 return out_indices_dist.size();
611 std::vector<size_t> &out_idx,
612 std::vector<float> &out_dist_sqr )
const
619 out_dist_sqr.resize(knn);
621 resultSet.
init(&out_idx[0], &out_dist_sqr[0] );
642 template <
int _DIM = -1>
653 if (&o!=
this)
clear();
689 const size_t N =
derived().kdtree_get_point_count();
714 const size_t N =
derived().kdtree_get_point_count();
730 typedef typename TKDTreeDataHolder<>::kdtree_index_t treeNd_t;
739 const size_t N =
derived().kdtree_get_point_count();