40 #ifndef PCL_SEARCH_SEARCH_H_
41 #define PCL_SEARCH_SEARCH_H_
72 template<
typename Po
intT>
80 typedef boost::shared_ptr<pcl::search::Search<PointT> >
Ptr;
81 typedef boost::shared_ptr<const pcl::search::Search<PointT> >
ConstPtr;
87 Search (
const std::string& name =
"",
bool sorted =
false)
90 , sorted_results_ (sorted)
103 virtual const std::string&
116 sorted_results_ = sorted;
154 std::vector<float> &k_sqr_distances)
const = 0;
165 template <
typename Po
intTDiff>
inline int
167 std::vector<int> &k_indices, std::vector<float> &k_sqr_distances)
const
196 std::vector<int> &k_indices, std::vector<float> &k_sqr_distances)
const
198 assert (index >= 0 && index < static_cast<int> (cloud.
points.size ()) &&
"Out-of-bounds error in nearestKSearch!");
221 std::vector<int> &k_indices, std::vector<float> &k_sqr_distances)
const
223 if (indices_ == NULL)
225 assert (index >= 0 && index < static_cast<int> (input_->points.size ()) &&
"Out-of-bounds error in nearestKSearch!");
226 return (
nearestKSearch (input_->points[index], k, k_indices, k_sqr_distances));
230 assert (index >= 0 && index < static_cast<int> (indices_->size ()) &&
"Out-of-bounds error in nearestKSearch!");
231 if (index >= static_cast<int> (indices_->size ()) || index < 0)
233 return (
nearestKSearch (input_->points[(*indices_)[index]], k, k_indices, k_sqr_distances));
246 std::vector< std::vector<float> >& k_sqr_distances)
const
248 if (indices.empty ())
250 k_indices.resize (cloud.
size ());
251 k_sqr_distances.resize (cloud.
size ());
252 for (
size_t i = 0; i < cloud.
size (); i++)
253 nearestKSearch (cloud, static_cast<int> (i), k, k_indices[i], k_sqr_distances[i]);
257 k_indices.resize (indices.size ());
258 k_sqr_distances.resize (indices.size ());
259 for (
size_t i = 0; i < indices.size (); i++)
260 nearestKSearch (cloud, indices[i], k, k_indices[i], k_sqr_distances[i]);
272 template <
typename Po
intTDiff>
void
274 std::vector< std::vector<float> > &k_sqr_distances)
const
282 if (indices.empty ())
285 for (
size_t i = 0; i < cloud.
size(); i++)
290 nearestKSearch (pc,std::vector<int>(),k,k_indices,k_sqr_distances);
294 pc.
resize (indices.size());
295 for (
size_t i = 0; i < indices.size(); i++)
298 cloud[indices[i]], pc[i]));
300 nearestKSearch (pc,std::vector<int>(),k,k_indices,k_sqr_distances);
316 std::vector<float>& k_sqr_distances,
unsigned int max_nn = 0)
const = 0;
328 template <
typename Po
intTDiff>
inline int
329 radiusSearchT (
const PointTDiff &point,
double radius, std::vector<int> &k_indices,
330 std::vector<float> &k_sqr_distances,
unsigned int max_nn = 0)
const
338 return (
radiusSearch (p, radius, k_indices, k_sqr_distances, max_nn));
360 std::vector<int> &k_indices, std::vector<float> &k_sqr_distances,
361 unsigned int max_nn = 0)
const
363 assert (index >= 0 && index < static_cast<int> (cloud.
points.size ()) &&
"Out-of-bounds error in radiusSearch!");
364 return (
radiusSearch(cloud.
points[index], radius, k_indices, k_sqr_distances, max_nn));
388 std::vector<float> &k_sqr_distances,
unsigned int max_nn = 0)
const
390 if (indices_ == NULL)
392 assert (index >= 0 && index < static_cast<int> (input_->points.size ()) &&
"Out-of-bounds error in radiusSearch!");
393 return (
radiusSearch (input_->points[index], radius, k_indices, k_sqr_distances, max_nn));
397 assert (index >= 0 && index < static_cast<int> (indices_->size ()) &&
"Out-of-bounds error in radiusSearch!");
398 return (
radiusSearch (input_->points[(*indices_)[index]], radius, k_indices, k_sqr_distances, max_nn));
414 const std::vector<int>& indices,
416 std::vector< std::vector<int> >& k_indices,
417 std::vector< std::vector<float> > &k_sqr_distances,
418 unsigned int max_nn = 0)
const
420 if (indices.empty ())
422 k_indices.resize (cloud.
size ());
423 k_sqr_distances.resize (cloud.
size ());
424 for (
size_t i = 0; i < cloud.
size (); i++)
425 radiusSearch (cloud, static_cast<int> (i), radius,k_indices[i], k_sqr_distances[i], max_nn);
429 k_indices.resize (indices.size ());
430 k_sqr_distances.resize (indices.size ());
431 for (
size_t i = 0; i < indices.size (); i++)
432 radiusSearch (cloud,indices[i],radius,k_indices[i],k_sqr_distances[i], max_nn);
448 template <
typename Po
intTDiff>
void
450 const std::vector<int>& indices,
452 std::vector< std::vector<int> > &k_indices,
453 std::vector< std::vector<float> > &k_sqr_distances,
454 unsigned int max_nn = 0)
const
462 if (indices.empty ())
465 for (
size_t i = 0; i < cloud.
size (); ++i)
467 radiusSearch (pc, std::vector<int> (), radius, k_indices, k_sqr_distances, max_nn);
471 pc.
resize (indices.size ());
472 for (
size_t i = 0; i < indices.size (); ++i)
474 radiusSearch (pc, std::vector<int>(), radius, k_indices, k_sqr_distances, max_nn);
479 void sortResults (std::vector<int>& indices, std::vector<float>& distances)
const;
482 bool sorted_results_;
488 Compare (
const std::vector<float>& distances)
489 : distances_ (distances)
493 bool operator () (
int first,
int second)
const
495 return distances_ [first] < distances_[second];
498 const std::vector<float>& distances_;
503 template<
typename Po
intT>
void
504 Search<PointT>::sortResults (std::vector<int>& indices, std::vector<float>& distances)
const
506 std::vector<int> order (indices.size ());
507 for (
size_t idx = 0; idx < order.size (); ++idx)
508 order [idx] = static_cast<int> (idx);
510 Compare compare (distances);
511 sort (order.begin (), order.end (), compare);
513 std::vector<int> sorted (indices.size ());
514 for (
size_t idx = 0; idx < order.size (); ++idx)
515 sorted [idx] = indices[order [idx]];
520 sort (distances.begin (), distances.end ());
525 #endif //#ifndef _PCL_SEARCH_GENERIC_SEARCH_H_