Skip to content
Snippets Groups Projects
TreeNode.cpp 1.61 KiB
Newer Older
#include <cstdlib>
#include "TreeNode.hpp"

namespace nbody {
	using namespace std;


Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
	TreeNode::TreeNode() {
		for (int i = 0; i < 3; i++) {
			this->bb.min[i] = 1.0;
			this->bb.max[i] = -1.0;
		}
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		this->afterSubtree = NULL;
		this->prev = this;
		this->next = this;
	}

	Box TreeNode::getBB() {
		return this->bb;
	}

	bool TreeNode::isSplitable() {
		if (this->bodies.size() < 2) {
			return false;
		}
		for (int i = 0; i < 3; i++) {
			if (this->bb.max[i] - this->bb.min[i] < FLT_MIN) {
				return false;
			}
		}
		return true;
	}

	void TreeNode::extendBBforBodies() {
		if (this->bodies.empty()) return;
		for (int i = 0; i < 3; i++) {
			this->bb.min[i] = this->bodies.front().getPosition(i);
			this->bb.max[i] = this->bodies.front().getPosition(i);
		}
		for (vector<Body>::iterator it = this->bodies.begin(); it != this->bodies.end(); it++) {
			for (int i = 0; i < 3; i++) {
				if (it->getPosition(i) < this->bb.min[i]) {
					this->bb.min[i] = it->getPosition(i);
				}
				if (it->getPosition(i) > this->bb.max[i]) {
					this->bb.max[i] = it->getPosition(i);
				}
			}
		}
	}
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed

	void TreeNode::extendBBtoCube() {
		this->bb.extendToCube();
	}

	vector<Body> TreeNode::getBodies() {
		return this->bodies;
	}
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed

	void TreeNode::insertBefore(TreeNode* node) {
		node->next = this;
		node->prev = this->prev;
		this->prev->next = node;
		this->prev = node;
	}

	void TreeNode::insertAfter(TreeNode* node) {
		this->insertBefore(node->next);
	}

	void TreeNode::unlink() {
		this->next->prev = this->prev;
		this->prev->next = this->next;
		this->next = this;
		this->prev = this;
	}