/*
* $Revision: 2523 $
*
* last checkin:
* $Author: gutwenger $
* $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
***************************************************************/
/** \file
* \brief Declaration of class QuadTreeNM.
*
* \author Stefan Hachul
*
* \par License:
* This file is part of the Open Graph Drawing Framework (OGDF).
*
* \par
* Copyright (C)
* See README.txt in the root directory of the OGDF installation for details.
*
* \par
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* Version 2 or 3 as published by the Free Software Foundation;
* see the file LICENSE.txt included in the packaging of this file
* for details.
*
* \par
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* \par
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* \see http://www.gnu.org/copyleft/gpl.html
***************************************************************/
#ifdef _MSC_VER
#pragma once
#endif
#ifndef OGDF_QUAD_TREE_NM_H
#define OGDF_QUAD_TREE_NM_H
#include "QuadTreeNodeNM.h"
#include "ParticleInfo.h"
namespace ogdf {
class QuadTreeNM
{
//Helping data structure that stores the information needed to represent
//the modified quadtree in the New Multipole Merthod (NMM)
public:
QuadTreeNM(); //constructor
~QuadTreeNM() { } //destructor
//Deletes the tree starting at node_ptr.
void delete_tree(QuadTreeNodeNM* node_ptr);
//Deletes the tree starting at node_ptr and counts the nodes of the subtree.
void delete_tree_and_count_nodes(QuadTreeNodeNM* node_ptr,int& nodecounter);
//Pre_order traversal of the tree rooted at node_ptr (with or without
//output of the M,L-lists from 0 to precision).
void cout_preorder(QuadTreeNodeNM* node_ptr);
void cout_preorder(QuadTreeNodeNM* node_ptr,int precision);
//Creates the root node and lets act_ptr and root_ptr point to the root node.
void init_tree() {
root_ptr = new QuadTreeNodeNM();
act_ptr = root_ptr;
}
//Sets act_ptr to the root_ptr.
void start_at_root()
{
act_ptr = root_ptr;
}
//Sets act_ptr to the father_ptr.
void go_to_father()
{
if (act_ptr->get_father_ptr() != NULL)
act_ptr = act_ptr->get_father_ptr();
else
cout<<"Error QuadTreeNM: No father Node exists";
}
//Sets act_ptr to the left_top_child_ptr.
void go_to_lt_child()
{
act_ptr = act_ptr->get_child_lt_ptr();
}
//Sets act_ptr to the right_top_child_ptr.
void go_to_rt_child()
{
act_ptr = act_ptr->get_child_rt_ptr();
}
//Sets act_ptr to the left_bottom_child_ptr.
void go_to_lb_child()
{
act_ptr = act_ptr->get_child_lb_ptr();
}
//Sets act_ptr to the right_bottom_child_ptr.
void go_to_rb_child()
{
act_ptr = act_ptr->get_child_rb_ptr();
}
//Creates a new left_top_child of the actual node (importing L_x(y)_ptr).
void create_new_lt_child(List* L_x_ptr, List* L_y_ptr);
void create_new_lt_child();
//Creates a new right_top_child of the actual node (importing L_x(y)_ptr).
void create_new_rt_child(List* L_x_ptr, List* L_y_ptr);
void create_new_rt_child();
//Creates a new left_bottom_child of the actual node (importing L_x(y)_ptr).
void create_new_lb_child(List* L_x_ptr, List* L_y_ptr);
void create_new_lb_child();
//Creates a new right_bottom_child of the actual node(importing L_x(y)_ptr).
void create_new_rb_child(List* L_x_ptr, List* L_y_ptr);
void create_new_rb_child();
//Returns the actual/root node pointer of the tree.
QuadTreeNodeNM* get_act_ptr() { return act_ptr; }
QuadTreeNodeNM* get_root_ptr() { return root_ptr; }
//Sets root_ptr to r_ptr.
void set_root_ptr(QuadTreeNodeNM* r_ptr) { root_ptr = r_ptr; }
//Sets act_ptr to a_ptr.
void set_act_ptr(QuadTreeNodeNM* a_ptr) { act_ptr = a_ptr; }
//Sets the content of *root_ptr to r.
void set_root_node(QuadTreeNodeNM& r) { *root_ptr = r; }
private:
QuadTreeNodeNM* root_ptr; //points to the root node
QuadTreeNodeNM* act_ptr; //points to the actual node
};
}//namespace ogdf
#endif