Skip to content
Snippets Groups Projects
Tree.cpp 1.77 KiB
Newer Older
#include <string>
#include <sstream>
#include <iostream>
#include <fstream>
#include "Tree.hpp"
#include "TreeNode.hpp"
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
	using namespace std;

Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		//insert dummy root node
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		this->nodes = new TreeNode(this);
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		delete this->nodes;
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		//remove all nodes; refresh root node
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		while (this->nodes->next != this->nodes) {
			TreeNode* node = this->nodes->next;

			node->unlink();
			delete node;
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		delete this->nodes;
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
		this->nodes = new TreeNode(this);
	}

	bool Tree::isCorrect() {
		TreeNode* current = this->nodes->next;

		while (current != this->nodes) {
			if (!current->isCorrect()) {
				return false;
			}
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
			if (current->next != this->nodes && current->next != current->afterSubtree) {
				cout << "inner node: " << current->bodies.size() << endl;
			} else {
				cout << "leaf: " << current->bodies.size() << endl;
			}
Paul Heinzlreiter's avatar
Paul Heinzlreiter committed
			//TODO: fix
			/*
			if (current->next != this->nodes && current->next != current->afterSubtree) {
				//inner node
				int numChildren = 0;

				for (TreeNode* child = current->next; child->afterSubtree != current->afterSubtree; child = child->afterSubtree) {
					numChildren++;

					if (!child->isCorrect()) {
						return false;
					}
				}
				if (dynamic_cast<BarnesHutTree*>(this) != NULL) {
					if (numChildren != 8) {
						return false;
					}
				}
			}
			*/
			current = current->next;
		}
		return true;

	vector<Body> Tree::dubinskiParse(string filename) {
		vector<Body> result;
		string line;
		ifstream infile(filename.c_str(), ifstream::in);
		double mass, px, py, pz, vx, vy, vz;

		while (infile >> mass >> px >> py >> pz >> vx >> vy >> vz) {
			Body b(px, py, pz, vx, vy, vz, mass);

			result.push_back(b);
		}
		infile.close();