PointSampler library (C++)
Loading...
Searching...
No Matches
distance_rejection_filter.hpp
Go to the documentation of this file.
1/* Copyright (c) 2025 Otto Link. Distributed under the terms of the GNU General
2 Public License. The full license is in the file LICENSE, distributed with
3 this software. */
4#pragma once
5
8
9#include <iostream>
10
11namespace ps
12{
13
34template <typename T, std::size_t N>
35std::vector<Point<T, N>> distance_rejection_filter(const std::vector<Point<T, N>> &points,
36 T min_dist)
37{
38 if (points.empty())
39 return {};
40
41 std::vector<Point<T, N>> result;
42 result.reserve(points.size());
43 result.push_back(points.front());
44
45 for (std::size_t i = 1; i < points.size(); ++i)
46 {
47 const auto &p = points[i];
48
49 PointCloudAdaptor<T, N> adaptor(result);
50 KDTree<T, N> index(N, adaptor);
51 index.buildIndex();
52
53 std::array<T, N> query;
54 for (std::size_t d = 0; d < N; ++d)
55 query[d] = p[d];
56
57 std::vector<nanoflann::ResultItem<unsigned int, T>> matches;
58 nanoflann::SearchParameters params;
59 const T radius = min_dist * min_dist;
60
61 const size_t found = index.radiusSearch(query.data(), radius, matches, params);
62
63 if (found == 0)
64 result.push_back(p);
65 }
66
67 return result;
68}
69
100template <typename T, std::size_t N, typename ScaleFn>
101std::vector<Point<T, N>> distance_rejection_filter_warped(
102 const std::vector<Point<T, N>> &points,
103 T base_min_dist,
104 ScaleFn scale_fn)
105{
106 if (points.empty())
107 return {};
108
109 std::vector<Point<T, N>> result;
110 result.reserve(points.size());
111 result.push_back(points.front());
112
113 for (std::size_t i = 1; i < points.size(); ++i)
114 {
115 const auto &p = points[i];
116 const T local_min_dist = base_min_dist * scale_fn(p);
117
118 PointCloudAdaptor<T, N> adaptor(result);
119 KDTree<T, N> index(N, adaptor);
120 index.buildIndex();
121
122 std::array<T, N> query;
123 for (std::size_t d = 0; d < N; ++d)
124 query[d] = p[d];
125
126 std::vector<nanoflann::ResultItem<unsigned int, T>> matches;
127 nanoflann::SearchParameters params;
128 const T radius = local_min_dist * local_min_dist;
129
130 const size_t found = index.radiusSearch(query.data(), radius, matches, params);
131 if (found == 0)
132 result.push_back(p);
133 }
134
135 return result;
136}
137
138} // namespace ps
Definition dbscan_clustering.hpp:11
nanoflann::KDTreeSingleIndexAdaptor< nanoflann::L2_Simple_Adaptor< T, PointCloudAdaptor< T, N > >, PointCloudAdaptor< T, N >, N > KDTree
Definition nanoflann_adaptator.hpp:35
std::vector< Point< T, N > > distance_rejection_filter(const std::vector< Point< T, N > > &points, T min_dist)
Filters a set of points using a greedy distance-based rejection.
Definition distance_rejection_filter.hpp:35
std::vector< Point< T, N > > distance_rejection_filter_warped(const std::vector< Point< T, N > > &points, T base_min_dist, ScaleFn scale_fn)
Filters points based on spatially-varying minimal distance constraints.
Definition distance_rejection_filter.hpp:101
Definition nanoflann_adaptator.hpp:13
A fixed-size N-dimensional point/vector class.
Definition point.hpp:39