48 lines
934 B
Text
48 lines
934 B
Text
|
/**
|
||
|
* Point Cloud Segmentation using Felzenszwalb-Huttenlocher Algorithm
|
||
|
*
|
||
|
* Copyright (C) Jacobs University Bremen
|
||
|
*
|
||
|
* Released under the GPL version 3.
|
||
|
*
|
||
|
* @author Mihai-Cotizo Sima
|
||
|
*/
|
||
|
|
||
|
|
||
|
#include <segmentation/disjoint-set.h>
|
||
|
|
||
|
universe::universe(int elements) {
|
||
|
elts = new uni_elt[elements];
|
||
|
num = elements;
|
||
|
for (int i = 0; i < elements; i++) {
|
||
|
elts[i].rank = 0;
|
||
|
elts[i].size = 1;
|
||
|
elts[i].p = i;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
universe::~universe() {
|
||
|
delete [] elts;
|
||
|
}
|
||
|
|
||
|
int universe::find(int x) {
|
||
|
int y = x;
|
||
|
while (y != elts[y].p)
|
||
|
y = elts[y].p;
|
||
|
elts[x].p = y;
|
||
|
return y;
|
||
|
}
|
||
|
|
||
|
void universe::join(int x, int y) {
|
||
|
if (elts[x].rank > elts[y].rank) {
|
||
|
elts[y].p = x;
|
||
|
elts[x].size += elts[y].size;
|
||
|
} else {
|
||
|
elts[x].p = y;
|
||
|
elts[y].size += elts[x].size;
|
||
|
if (elts[x].rank == elts[y].rank)
|
||
|
elts[y].rank++;
|
||
|
}
|
||
|
num--;
|
||
|
}
|