23 const std::size_t size =
indices_->size();
35 "Requested number of points is greater than point cloud size!");
38 std::vector<float> distances_to_selected_points (size, std::numeric_limits<float>::max ());
41 std::mt19937 random_gen(
seed_);
42 std::uniform_int_distribution<index_t> dis(0, size -1);
45 auto toCloudIndex = [
this](
const auto idx){
return (*
indices_)[idx];};
48 index_t max_index = dis(random_gen);
49 distances_to_selected_points[max_index] = -1.0;
50 indices.push_back(toCloudIndex(max_index));
56 const PointT& max_index_point = (*input_)[toCloudIndex(max_index)];
58 for (std::size_t i = 0; i < size; ++i)
60 if (distances_to_selected_points[i] == -1.0)
62 distances_to_selected_points[i] = std::min(distances_to_selected_points[i],
geometry::distance((*
input_)[toCloudIndex(i)], max_index_point));
63 if (distances_to_selected_points[i] > distances_to_selected_points[next_max_index])
70 max_index = next_max_index;
71 distances_to_selected_points[max_index] = -1.0;
72 indices.push_back(toCloudIndex(max_index));
78 for (std::size_t k = 0; k < distances_to_selected_points.size(); ++k)
80 if (distances_to_selected_points[k] != -1.0)
81 (*removed_indices_).push_back(toCloudIndex(k));