15 std::vector<PointXYZ>& supports,
16 std::vector<int>& neighbors_indices,
23 float r2 = radius * radius;
30 std::vector<std::vector<int>> tmp(queries.size());
35 for (
auto& p0 : queries) {
37 for (
auto& p : supports) {
38 if ((p0 - p).sq_norm() < r2) {
40 if ((
signed)tmp[i0].
size() > max_count)
41 max_count = tmp[i0].size();
49 neighbors_indices.resize(queries.size() * max_count);
51 for (
auto& inds : tmp) {
52 for (
int j = 0; j < max_count; j++) {
53 if (j < (
signed)inds.size())
54 neighbors_indices[i0 * max_count + j] = inds[j];
56 neighbors_indices[i0 * max_count + j] = -1;
65 std::vector<PointXYZ>& supports,
66 std::vector<int>& neighbors_indices,
72 float r2 = radius * radius;
80 std::vector<std::vector<int>> tmp(queries.size());
81 std::vector<std::vector<float>> dists(queries.size());
86 for (
auto& p0 : queries) {
88 for (
auto& p : supports) {
89 d2 = (p0 - p).sq_norm();
92 auto it = std::upper_bound(dists[i0].begin(), dists[i0].end(),
94 int index = std::distance(dists[i0].begin(), it);
97 dists[i0].insert(it, d2);
98 tmp[i0].insert(tmp[i0].begin() + index, i);
101 if ((
signed)tmp[i0].
size() > max_count)
102 max_count = tmp[i0].size();
110 neighbors_indices.resize(queries.size() * max_count);
112 for (
auto& inds : tmp) {
113 for (
int j = 0; j < max_count; j++) {
114 if (j < (
signed)inds.size())
115 neighbors_indices[i0 * max_count + j] = inds[j];
117 neighbors_indices[i0 * max_count + j] = -1;
126 std::vector<PointXYZ>& supports,
127 std::vector<int>& q_batches,
128 std::vector<int>& s_batches,
129 std::vector<int>& neighbors_indices,
138 float r2 = radius * radius;
142 std::vector<std::vector<nanoflann::ResultItem<unsigned int, float>>>
143 all_inds_dists(queries.size());
157 nanoflann::KDTreeSingleIndexAdaptorParams tree_params(10 );
160 typedef nanoflann::KDTreeSingleIndexAdaptor<
161 nanoflann::L2_Simple_Adaptor<float, PointCloud>,
PointCloud, 3>
169 std::vector<PointXYZ>(supports.begin() + sum_sb,
170 supports.begin() + sum_sb + s_batches[b]);
171 index =
new my_kd_tree_t(3, current_cloud, tree_params);
178 nanoflann::SearchParameters search_params;
179 search_params.sorted =
true;
181 for (
auto& p0 : queries) {
183 if (i0 == sum_qb + q_batches[b]) {
184 sum_qb += q_batches[b];
185 sum_sb += s_batches[b];
189 current_cloud.pts.clear();
190 current_cloud.pts = std::vector<PointXYZ>(
191 supports.begin() + sum_sb,
192 supports.begin() + sum_sb + s_batches[b]);
196 index =
new my_kd_tree_t(3, current_cloud, tree_params);
201 all_inds_dists[i0].reserve(max_count);
204 float query_pt[3] = {p0.x, p0.y, p0.z};
205 size_t nMatches = index->radiusSearch(query_pt, r2, all_inds_dists[i0],
209 if ((
signed)nMatches > max_count) max_count = nMatches;
216 neighbors_indices.resize(queries.size() * max_count);
221 for (
auto& inds_dists : all_inds_dists) {
223 if (i0 == sum_qb + q_batches[b]) {
224 sum_qb += q_batches[b];
225 sum_sb += s_batches[b];
229 for (
int j = 0; j < max_count; j++) {
230 if (j < (
signed)inds_dists.size())
231 neighbors_indices[i0 * max_count + j] =
232 inds_dists[j].first + sum_sb;
234 neighbors_indices[i0 * max_count + j] = supports.size();
::ccPointCloud PointCloud
void batch_nanoflann_neighbors(std::vector< PointXYZ > &queries, std::vector< PointXYZ > &supports, std::vector< int > &q_batches, std::vector< int > &s_batches, std::vector< int > &neighbors_indices, float radius)
void ordered_neighbors(std::vector< PointXYZ > &queries, std::vector< PointXYZ > &supports, std::vector< int > &neighbors_indices, float radius)
void brute_neighbors(std::vector< PointXYZ > &queries, std::vector< PointXYZ > &supports, std::vector< int > &neighbors_indices, float radius, int verbose)
Generic file read and write utility for python interface.