30 for (
size_t vertex1 = 0; vertex1 <
cluster.size(); ++vertex1) {
31 for (
size_t vertex2 = vertex1 + 1; vertex2 <
cluster.size(); ++vertex2) {
32 size_t point_index1 =
cluster[vertex1], point_index2 =
cluster[vertex2];
33 const Point &p = cloud[point_index1];
34 const Point &q = cloud[point_index2];
37 double distance = (q - p).squared_norm();
39 Edge e = {vertex1, vertex2, distance};
43 std::sort(edges.begin(), edges.end());
49 void create_adj(std::vector<std::vector<size_t>> &adj,
const std::vector<Edge> edges)
51 for (std::vector<Edge>::const_iterator edge = edges.begin(); edge != edges.end(); ++edge) {
52 adj[edge->src].push_back(edge->dest);
53 adj[edge->dest].push_back(edge->src);
61 std::vector<Edge>::iterator edge = edges.begin();
62 double dmax2 = dmax * dmax;
63 while (edge != edges.end()) {
64 if (edge->weight > dmax2) {
65 edge = edges.erase(edge);
74 void mst(
const std::vector<Edge> &edges, std::vector<Edge> &mst_edges,
size_t vcount)
76 std::vector<size_t> groups(vcount);
77 for (
size_t i = 0; i < groups.size(); i++) {
81 for (std::vector<Edge>::const_iterator e = edges.begin(); e != edges.end(); ++e) {
82 size_t group_a = groups[e->src];
83 size_t group_b = groups[e->dest];
86 if (group_a != group_b) {
88 for (std::vector<size_t>::iterator it = groups.begin(); it != groups.end(); ++it) {
92 mst_edges.push_back(*e);
101 void dfs_util(std::vector<size_t> &new_cluster,
const size_t vertex, std::vector<bool> &visited,
102 const std::vector<size_t> &
cluster,
const std::vector<std::vector<size_t>> &adj)
104 std::stack<size_t> stack;
106 while (!stack.empty()) {
107 size_t v = stack.top();
110 new_cluster.push_back(
cluster[v]);
112 for (std::vector<size_t>::const_iterator it = adj[v].begin(); it != adj[v].end(); ++it) {
125 void max_step(std::vector<std::vector<size_t>> &new_clusters,
const std::vector<size_t> &
cluster,
126 const PointCloud &cloud,
double dmax,
size_t min_size)
128 size_t vcount =
cluster.size();
130 std::vector<std::vector<size_t>> adj(vcount);
131 std::vector<Edge> edges, mst_edges;
132 std::vector<bool> visited(vcount);
134 mst(edges, mst_edges, vcount);
138 for (
size_t v = 0; v < vcount; ++v) {
140 std::vector<size_t> new_cluster;
142 new_clusters.push_back(new_cluster);