48 std::vector<int> labels(points.size(), -1);
51 for (
size_t i = 0; i < points.size(); ++i)
57 std::vector<nanoflann::ResultItem<unsigned int, T>> ret_matches;
58 nanoflann::SearchParameters params;
59 const T eps_sq = eps * eps;
60 std::array<T, N> query;
61 for (
size_t d = 0; d < N; ++d)
62 query[d] = points[i][d];
64 index.radiusSearch(query.data(), eps_sq, ret_matches, params);
66 if (ret_matches.size() < min_pts)
73 labels[i] = cluster_id;
75 std::vector<size_t> seed_set;
76 seed_set.reserve(ret_matches.size());
77 for (
auto &m : ret_matches)
79 seed_set.push_back(m.first);
81 for (
size_t j = 0; j < seed_set.size(); ++j)
83 size_t neighbor_idx = seed_set[j];
84 if (labels[neighbor_idx] == -2)
85 labels[neighbor_idx] = cluster_id;
89 if (labels[neighbor_idx] != -1)
93 labels[neighbor_idx] = cluster_id;
97 for (
size_t d = 0; d < N; ++d)
98 nq[d] = points[neighbor_idx][d];
99 std::vector<nanoflann::ResultItem<unsigned int, T>> n_matches;
100 index.radiusSearch(nq.data(), eps_sq, n_matches, params);
102 if (n_matches.size() >= min_pts)
104 for (
auto &nm : n_matches)
105 if (labels[nm.first] == -1)
106 seed_set.push_back(nm.first);