OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
QuadTree.cpp
Go to the documentation of this file.
2#include <utility>
3
4namespace mslang {
6 : level_m(right.level_m),
7 objects_m(right.objects_m.begin(), right.objects_m.end()),
8 bb_m(right.bb_m),
9 nodes_m() {
10 if (!right.nodes_m.empty()) {
11 for (unsigned int i = 0; i < 4u; ++i) {
12 nodes_m.emplace_back(new QuadTree(*right.nodes_m[i]));
13 }
14 }
15 }
16
18 // for (std::shared_ptr<Base> &obj: objects_m)
19 // obj.reset();
20
21 objects_m.clear();
22 nodes_m.clear();
23 }
24
26 objects_m.clear();
27 nodes_m.clear();
28 }
29
30 void QuadTree::operator=(const QuadTree& right) {
31 level_m = right.level_m;
32 objects_m.insert(objects_m.end(), right.objects_m.begin(), right.objects_m.end());
33 bb_m = right.bb_m;
34
35 if (!nodes_m.empty()) nodes_m.clear();
36
37 if (!right.nodes_m.empty()) {
38 for (unsigned int i = 0; i < 4u; ++i) {
39 nodes_m.emplace_back(new QuadTree(*right.nodes_m[i]));
40 }
41 }
42 }
43
44 void QuadTree::transferIfInside(std::list<std::shared_ptr<Base> >& objs) {
45 for (std::shared_ptr<Base>& obj : objs) {
46 if (bb_m.isInside(obj->bb_m)) {
47 objects_m.emplace_back(std::move(obj));
48 }
49 }
50
51 objs.remove_if([](const std::shared_ptr<Base> obj) {
52 return !obj;
53 });
54 }
55
57 double X[] = {
58 bb_m.center_m[0] - 0.5 * bb_m.width_m, bb_m.center_m[0],
59 bb_m.center_m[0] + 0.5 * bb_m.width_m};
60 double Y[] = {
61 bb_m.center_m[1] - 0.5 * bb_m.height_m, bb_m.center_m[1],
62 bb_m.center_m[1] + 0.5 * bb_m.height_m};
63
64 bool allEmpty = true;
65
66 nodes_m.reserve(4);
67 for (unsigned int i = 0; i < 4u; ++i) {
68 nodes_m.emplace_back(new QuadTree(
70 Vector_t<double, 3>(X[i / 2], Y[i % 2], 0.0),
71 Vector_t<double, 3>(X[i / 2 + 1], Y[i % 2 + 1], 0.0))));
72
73 nodes_m.back()->transferIfInside(objects_m);
74
75 if (!nodes_m.back()->objects_m.empty()) {
76 allEmpty = false;
77 }
78 }
79
80 if (allEmpty) {
81 nodes_m.clear();
82 return;
83 }
84
85 for (unsigned int i = 0; i < 4u; ++i) {
86 nodes_m[i]->buildUp();
87 }
88 }
89
90 void QuadTree::writeGnuplot(std::ostream& out) const {
91 out << "# level: " << level_m << ", size: " << objects_m.size() << std::endl;
92 bb_m.writeGnuplot(out);
93 out << "# num holes: " << objects_m.size() << std::endl;
94 out << std::endl;
95
96 if (!nodes_m.empty()) {
97 for (unsigned int i = 0; i < 4u; ++i) {
98 nodes_m[i]->writeGnuplot(out);
99 }
100 }
101 }
102
104 if (!nodes_m.empty()) {
106 unsigned int idx = (X[1] < 0.0 ? 0 : 1);
107 idx += (X[0] < 0.0 ? 0 : 2);
108
109 if (nodes_m[idx]->isInside(R)) {
110 return true;
111 }
112 }
113
114 for (const std::shared_ptr<Base>& obj : objects_m) {
115 if (obj->isInside(R)) {
116 return true;
117 }
118 }
119
120 return false;
121 }
122
123 void QuadTree::getDepth(unsigned int& d) const {
124 if (!nodes_m.empty()) {
125 for (const auto& node : nodes_m) {
126 node->getDepth(d);
127 }
128 } else {
129 if ((unsigned int)level_m > d) d = level_m;
130 }
131 }
132} // namespace mslang
ippl::Vector< T, Dim > Vector_t
Vector_t< double, 3 > center_m
bool isInside(const Vector_t< double, 3 > &X) const
virtual void writeGnuplot(std::ostream &out) const
void getDepth(unsigned int &d) const
Definition QuadTree.cpp:123
std::vector< std::shared_ptr< QuadTree > > nodes_m
Definition QuadTree.h:13
void writeGnuplot(std::ostream &out) const
Definition QuadTree.cpp:90
bool isInside(const Vector_t< double, 3 > &R) const
Definition QuadTree.cpp:103
void transferIfInside(std::list< std::shared_ptr< Base > > &objs)
Definition QuadTree.cpp:44
void operator=(const QuadTree &right)
Definition QuadTree.cpp:30
BoundingBox2D bb_m
Definition QuadTree.h:12
std::list< std::shared_ptr< Base > > objects_m
Definition QuadTree.h:11