Newer
Older
#include "BarnesHutTree.hpp"
namespace nbody {
BarnesHutTree::BarnesHutTree() {
}
BarnesHutTree::~BarnesHutTree() {
}
vector<Box> BarnesHutTree::splitBB(TreeNode* node) {
vector<Box> result;
for (int i = 0; i < 8; i++) {
Box current = node->getBB();
for (int j = 0; j < 3; j++) {
double middle = node->getBB().getMin(j) + (node->getBB().getMax(j) - node->getBB().getMin(j)) / 2.0;
if (i & (1 >> j)) {
current.setMin(j, middle);
} else {
current.setMax(j, middle);
}
}
result.push_back(current);
}
return result;
}
void BarnesHutTree::build(vector<Body> bodies) {
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
if (bodies.empty()) return;
this->nodes->insertAfter(new TreeNode());
current = this->nodes->next;
current->bodies = bodies;
current->extendBBforBodies();
current->extendBBtoCube();
while (current != this->nodes) {
if (current->isSplitable()) {
vector<Box> subboxes = this->splitBB(current);
vector<Body> localBodies = current->getBodies();
TreeNode* after = current->next;
for (vector<Box>::iterator bit = subboxes.begin(); bit != subboxes.end(); bit++) {
TreeNode* child = new TreeNode();
child->bb = *bit;
child->bodies = bit->containedBodies(localBodies);
current->next->insertBefore(child);
}
for (TreeNode* child = current->next; child != after->prev; child = child->next) {
child->afterSubtree = child->next;
}
after->prev->afterSubtree = after->afterSubtree;
current->bodies.clear();
}
current = current->next;
}
/*
this->nodes->insertAfter(new TreeNode());
current = this->nodes->next;
current->bodies = bodies;
current->extendBBforBodies();
current->extendBBtoCube();
while (current != this->nodes) {
current++;
}
*/
/*
while (current != this->nodes) {
if (current->isSplitable()) {
vector<Box> subboxes = this->splitBB(current);
vector<Body> localBodies = current->getBodies();
for (vector<Box>::iterator bit = subboxes.begin(); bit != subboxes.end(); bit++) {
}
}
current++; //TODO: check if needed
}
*/
/*
this->nodes = new TreeNode(this);
this->nodes->bodies = bodies;
this->nodes->extendBBforBodies();
this->nodes->extendBBtoCube();
current = this->nodes;
do {
} while (current != this->nodes);
it = this->nodes.begin();
while (it != this->nodes.end()) {
(*it)->afterSubtree = it;
(*it)->afterSubtree++;
if ((*it)->isSplitable()) {
vector<Box> subboxes = this->splitBB(*it);
for (vector<Box>::iterator bit = subboxes.begin(); bit != subboxes.end(); bit++) {
current->bodies = bit->containedBodies(localBodies);
//this->nodes.insert((*it)->afterSubtree, current);
}
(*it)->bodies.clear();
}
it++;