#include <string> #include <sstream> #include <iostream> #include <fstream> #include "Tree.hpp" #include "Node.hpp" namespace nbody { using namespace std; Tree::Tree() { //insert dummy root node this->nodes = new Node(this); } Tree::~Tree() { this->clean(); delete this->nodes; } void Tree::clean() { //remove all nodes; refresh root node while (this->nodes->next != this->nodes) { Node* node = this->nodes->next; node->unlink(); delete node; } delete this->nodes; this->nodes = new Node(this); } bool Tree::isCorrect() { Node* current = this->nodes->next; while (current != this->nodes) { if (!current->isCorrect()) { return false; } current = current->next; } return true; } unsigned long Tree::numberOfNodes() { unsigned long nodes = 0; for (Node* node = this->nodes->next; node != this->nodes; node = node->next) { nodes++; } return nodes; } void Tree::accumulateForceFor(Body& body) { body.resetAcceleration(); for (Node* n = this->nodes->next; n != this->nodes; n = n->next) { if (n->leaf) { for (vector<Body>::iterator it = n->bodies.begin(); it != n->bodies.end(); it++) { body.accumulateForce(*it); } } } } 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(); return result; } }