/*
* $Revision: 2552 $
*
* last checkin:
* $Author: gutwenger $
* $Date: 2012-07-05 16:45:20 +0200 (Do, 05. Jul 2012) $
***************************************************************/
/** \file
* \brief Implementation 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
***************************************************************/
#include "QuadTreeNM.h"
namespace ogdf {
QuadTreeNM::QuadTreeNM()
{
root_ptr = act_ptr =NULL;
}
void QuadTreeNM::create_new_lt_child(
List* L_x_ptr,
List* L_y_ptr)
{
QuadTreeNodeNM* new_ptr = new QuadTreeNodeNM();
DPoint old_Sm_dlc = act_ptr->get_Sm_downleftcorner();
DPoint new_Sm_dlc;
new_Sm_dlc.m_x = old_Sm_dlc.m_x;
new_Sm_dlc.m_y = old_Sm_dlc.m_y+act_ptr->get_Sm_boxlength()/2;
new_ptr->set_Sm_level(act_ptr->get_Sm_level()+1);
new_ptr->set_Sm_downleftcorner(new_Sm_dlc);
new_ptr->set_Sm_boxlength((act_ptr->get_Sm_boxlength())/2);
new_ptr->set_x_List_ptr(L_x_ptr);
new_ptr->set_y_List_ptr(L_y_ptr);
new_ptr->set_father_ptr(act_ptr);
act_ptr->set_child_lt_ptr(new_ptr);
}
void QuadTreeNM::create_new_lt_child()
{
QuadTreeNodeNM* new_ptr = new QuadTreeNodeNM();
DPoint old_Sm_dlc = act_ptr->get_Sm_downleftcorner();
DPoint new_Sm_dlc;
new_Sm_dlc.m_x = old_Sm_dlc.m_x;
new_Sm_dlc.m_y = old_Sm_dlc.m_y+act_ptr->get_Sm_boxlength()/2;
new_ptr->set_Sm_level(act_ptr->get_Sm_level()+1);
new_ptr->set_Sm_downleftcorner(new_Sm_dlc);
new_ptr->set_Sm_boxlength((act_ptr->get_Sm_boxlength())/2);
new_ptr->set_father_ptr(act_ptr);
act_ptr->set_child_lt_ptr(new_ptr);
}
void QuadTreeNM::create_new_rt_child(
List* L_x_ptr,
List* L_y_ptr)
{
QuadTreeNodeNM* new_ptr = new QuadTreeNodeNM();
DPoint old_Sm_dlc = act_ptr->get_Sm_downleftcorner();
DPoint new_Sm_dlc;
new_Sm_dlc.m_x = old_Sm_dlc.m_x+act_ptr->get_Sm_boxlength()/2;
new_Sm_dlc.m_y = old_Sm_dlc.m_y+act_ptr->get_Sm_boxlength()/2;
new_ptr->set_Sm_level(act_ptr->get_Sm_level()+1);
new_ptr->set_Sm_downleftcorner(new_Sm_dlc);
new_ptr->set_Sm_boxlength((act_ptr->get_Sm_boxlength())/2);
new_ptr->set_x_List_ptr(L_x_ptr);
new_ptr->set_y_List_ptr(L_y_ptr);
new_ptr->set_father_ptr(act_ptr);
act_ptr->set_child_rt_ptr(new_ptr);
}
void QuadTreeNM::create_new_rt_child()
{
QuadTreeNodeNM* new_ptr = new QuadTreeNodeNM();
DPoint old_Sm_dlc = act_ptr->get_Sm_downleftcorner();
DPoint new_Sm_dlc;
new_Sm_dlc.m_x = old_Sm_dlc.m_x+act_ptr->get_Sm_boxlength()/2;
new_Sm_dlc.m_y = old_Sm_dlc.m_y+act_ptr->get_Sm_boxlength()/2;
new_ptr->set_Sm_level(act_ptr->get_Sm_level()+1);
new_ptr->set_Sm_downleftcorner(new_Sm_dlc);
new_ptr->set_Sm_boxlength((act_ptr->get_Sm_boxlength())/2);
new_ptr->set_father_ptr(act_ptr);
act_ptr->set_child_rt_ptr(new_ptr);
}
void QuadTreeNM::create_new_lb_child(
List* L_x_ptr,
List* L_y_ptr)
{
QuadTreeNodeNM* new_ptr = new QuadTreeNodeNM();
DPoint old_Sm_dlc = act_ptr->get_Sm_downleftcorner();
DPoint new_Sm_dlc;
new_Sm_dlc.m_x = old_Sm_dlc.m_x;
new_Sm_dlc.m_y = old_Sm_dlc.m_y;
new_ptr->set_Sm_level(act_ptr->get_Sm_level()+1);
new_ptr->set_Sm_downleftcorner(new_Sm_dlc);
new_ptr->set_Sm_boxlength((act_ptr->get_Sm_boxlength())/2);
new_ptr->set_x_List_ptr(L_x_ptr);
new_ptr->set_y_List_ptr(L_y_ptr);
new_ptr->set_father_ptr(act_ptr);
act_ptr->set_child_lb_ptr(new_ptr);
}
void QuadTreeNM::create_new_lb_child()
{
QuadTreeNodeNM* new_ptr = new QuadTreeNodeNM();
DPoint old_Sm_dlc = act_ptr->get_Sm_downleftcorner();
DPoint new_Sm_dlc;
new_Sm_dlc.m_x = old_Sm_dlc.m_x;
new_Sm_dlc.m_y = old_Sm_dlc.m_y;
new_ptr->set_Sm_level(act_ptr->get_Sm_level()+1);
new_ptr->set_Sm_downleftcorner(new_Sm_dlc);
new_ptr->set_Sm_boxlength((act_ptr->get_Sm_boxlength())/2);
new_ptr->set_father_ptr(act_ptr);
act_ptr->set_child_lb_ptr(new_ptr);
}
void QuadTreeNM::create_new_rb_child(
List* L_x_ptr,
List* L_y_ptr)
{
QuadTreeNodeNM* new_ptr = new QuadTreeNodeNM();
DPoint old_Sm_dlc = act_ptr->get_Sm_downleftcorner();
DPoint new_Sm_dlc;
new_Sm_dlc.m_x = old_Sm_dlc.m_x+act_ptr->get_Sm_boxlength()/2;
new_Sm_dlc.m_y = old_Sm_dlc.m_y;
new_ptr->set_Sm_level(act_ptr->get_Sm_level()+1);
new_ptr->set_Sm_downleftcorner(new_Sm_dlc);
new_ptr->set_Sm_boxlength((act_ptr->get_Sm_boxlength())/2);
new_ptr->set_x_List_ptr(L_x_ptr);
new_ptr->set_y_List_ptr(L_y_ptr);
new_ptr->set_father_ptr(act_ptr);
act_ptr->set_child_rb_ptr(new_ptr);
}
void QuadTreeNM::create_new_rb_child()
{
QuadTreeNodeNM* new_ptr = new QuadTreeNodeNM();
DPoint old_Sm_dlc = act_ptr->get_Sm_downleftcorner();
DPoint new_Sm_dlc;
new_Sm_dlc.m_x = old_Sm_dlc.m_x+act_ptr->get_Sm_boxlength()/2;
new_Sm_dlc.m_y = old_Sm_dlc.m_y;
new_ptr->set_Sm_level(act_ptr->get_Sm_level()+1);
new_ptr->set_Sm_downleftcorner(new_Sm_dlc);
new_ptr->set_Sm_boxlength((act_ptr->get_Sm_boxlength())/2);
new_ptr->set_father_ptr(act_ptr);
act_ptr->set_child_rb_ptr(new_ptr);
}
void QuadTreeNM::delete_tree(QuadTreeNodeNM* node_ptr)
{
if(node_ptr != NULL)
{
if(node_ptr->get_child_lt_ptr() != NULL)
delete_tree(node_ptr->get_child_lt_ptr());
if(node_ptr->get_child_rt_ptr() != NULL)
delete_tree(node_ptr->get_child_rt_ptr());
if(node_ptr->get_child_lb_ptr() != NULL)
delete_tree(node_ptr->get_child_lb_ptr());
if(node_ptr->get_child_rb_ptr() != NULL)
delete_tree(node_ptr->get_child_rb_ptr());
delete node_ptr;
if (node_ptr == root_ptr)
root_ptr = NULL;
}
}
void QuadTreeNM::delete_tree_and_count_nodes(QuadTreeNodeNM* node_ptr, int& nodecounter)
{
if(node_ptr != NULL)
{
nodecounter++;
if(node_ptr->get_child_lt_ptr() != NULL)
delete_tree_and_count_nodes(node_ptr->get_child_lt_ptr(),nodecounter);
if(node_ptr->get_child_rt_ptr() != NULL)
delete_tree_and_count_nodes(node_ptr->get_child_rt_ptr(),nodecounter);
if(node_ptr->get_child_lb_ptr() != NULL)
delete_tree_and_count_nodes(node_ptr->get_child_lb_ptr(),nodecounter);
if(node_ptr->get_child_rb_ptr() != NULL)
delete_tree_and_count_nodes(node_ptr->get_child_rb_ptr(),nodecounter);
delete node_ptr;
if (node_ptr == root_ptr)
root_ptr = NULL;
}
}
void QuadTreeNM::cout_preorder(QuadTreeNodeNM* node_ptr)
{
if(node_ptr != NULL)
{
cout<< *node_ptr <get_child_lt_ptr() != NULL)
cout_preorder(node_ptr->get_child_lt_ptr());
if(node_ptr->get_child_rt_ptr() != NULL)
cout_preorder(node_ptr->get_child_rt_ptr());
if(node_ptr->get_child_lb_ptr() != NULL)
cout_preorder(node_ptr->get_child_lb_ptr());
if(node_ptr->get_child_rb_ptr() != NULL)
cout_preorder(node_ptr->get_child_rb_ptr());
}
}
void QuadTreeNM::cout_preorder(QuadTreeNodeNM* node_ptr, int precision)
{
int i;
if(node_ptr != NULL)
{
complex* L =node_ptr->get_local_exp();
complex* M =node_ptr->get_multipole_exp();
cout<< *node_ptr <get_child_lt_ptr() != NULL)
cout_preorder(node_ptr->get_child_lt_ptr(),precision);
if(node_ptr->get_child_rt_ptr() != NULL)
cout_preorder(node_ptr->get_child_rt_ptr(),precision);
if(node_ptr->get_child_lb_ptr() != NULL)
cout_preorder(node_ptr->get_child_lb_ptr(),precision);
if(node_ptr->get_child_rb_ptr() != NULL)
cout_preorder(node_ptr->get_child_rb_ptr(),precision);
}
}
}//namespace ogdf