ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
Universe.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 #include "Universe.h"
8 
9 namespace cloudViewer {
10 
11 Universe::Universe(int elements) {
12  elts = new uni_elt[static_cast<unsigned long>(elements)];
13  allelems = elements;
14  num = elements;
15  initialize();
16 }
17 
19  num = allelems;
20  for (int i = 0; i < allelems; i++) {
21  elts[i].rank = 0;
22  elts[i].size = 1;
23  elts[i].p = i; // initialized to the index
24  }
25 }
26 
27 Universe::~Universe() { delete[] elts; }
28 
29 int Universe::find(int x) {
30  int y = x;
31  while (y != elts[y].p) // follow the index stored in p if not the same that
32  // the index
33  y = elts[y].p;
34  elts[x].p = y; // update x element to the final value (instead of keeping
35  // multiple indirections), so next time we will access it
36  // directly.
37  return y;
38 }
39 
40 void Universe::join(int x, int y) {
41  // join elements in the one with the highest rank
42  if (elts[x].rank > elts[y].rank) {
43  elts[y].p = x;
44  elts[x].size += elts[y].size;
45  } else {
46  elts[x].p = y;
47  elts[y].size += elts[x].size;
48  if (elts[x].rank == elts[y].rank) elts[y].rank++;
49  }
50  num--; // the number of elements has been reduced by one
51 }
52 
53 void Universe::addEdge(int x, int y) {
54  int a = find(x);
55  int b = find(y);
56  if (a != b) {
57  join(a, b);
58  }
59 }
60 
61 } // namespace cloudViewer
void addEdge(int x, int y)
Definition: Universe.cpp:53
void join(int x, int y)
Definition: Universe.cpp:40
void initialize()
Initialize all elements to the default values.
Definition: Universe.cpp:18
Universe(int elements)
Definition: Universe.cpp:11
Generic file read and write utility for python interface.