cgma
|
#include <RTreeNode.hpp>
Definition at line 24 of file RTreeNode.hpp.
MY_INLINE RTreeNode< Y >::RTreeNode | ( | Y | data, |
double | tol, | ||
int | max_children, | ||
int | min_children | ||
) |
Definition at line 31 of file RTreeNode.cpp.
{ maxChildren = max_children; minChildren = min_children; myChildrenNodes = new RTreeNode<Y>* [maxChildren]; int ii; for ( ii = 0; ii < maxChildren; ii++ ) myChildrenNodes[ii] = (RTreeNode<Y>*) NULL; if ( data == NULL ) { PRINT_ERROR("Building RTree with null data is not allowed!\n"); assert(data != NULL); } myData = data; myLevel = DATA_RNODE; CubitBox temp_box = data->bounding_box(); //Check to see if any of the min/max pairs are less than the tolerance. //make them bigger if they are... CubitVector min = temp_box.minimum(); CubitVector max = temp_box.maximum(); if ( max.x() - min.x() < tol ) { min.x(min.x()-.6*tol); max.x(max.x()+.6*tol); } if ( max.y() - min.y() < tol ) { min.y(min.y()-.6*tol); max.y(max.y()+.6*tol); } if ( max.z() - min.z() < tol ) { min.z(min.z()-.6*tol); max.z(max.z()+.6*tol); } myBoundingBox = new CubitBox(min, max); myParent = NULL; nextChildIndex = 0; markedFlag = 0; distIsBox = 1; myDist = CUBIT_DBL_MAX; }
MY_INLINE RTreeNode< Y >::RTreeNode | ( | CubitBox & | bounding_box, |
int | max_children, | ||
int | min_children | ||
) |
Definition at line 75 of file RTreeNode.cpp.
{ maxChildren = max_children; minChildren = min_children; myBoundingBox = new CubitBox(bounding_box); myChildrenNodes = new RTreeNode<Y>* [maxChildren]; int ii; for ( ii = 0; ii < maxChildren; ii++ ) myChildrenNodes[ii] = (RTreeNode<Y>*) NULL; myData = NULL; myLevel = UNSET_RNODE; myParent = NULL; nextChildIndex = 0; markedFlag = 0; distIsBox = 1; myDist = CUBIT_DBL_MAX; }
Definition at line 97 of file RTreeNode.cpp.
{ if ( myChildrenNodes ) delete [] myChildrenNodes; if ( myBoundingBox ) delete myBoundingBox; }
MY_INLINE void RTreeNode< Y >::add_child | ( | RTreeNode< Y > * | child_node, |
CubitBoolean | recalc_b_box | ||
) |
Definition at line 424 of file RTreeNode.cpp.
{ assert(nextChildIndex < maxChildren && child_node != NULL ); myChildrenNodes[nextChildIndex] = child_node; //update the bounding box. by uniting with child node... if ( recalc_b_box ) { CubitBox *old_box = myBoundingBox; myBoundingBox = new CubitBox( *old_box |= child_node->bounding_box()); delete old_box; } nextChildIndex++; child_node->set_parent(this); }
MY_INLINE CubitStatus RTreeNode< Y >::adjust_tree | ( | RTreeNode< Y > * | l, |
RTreeNode< Y > * | ll, | ||
RTreeNode< Y > * | root_node, | ||
RTreeNode< Y > *& | new_root | ||
) | [private] |
Definition at line 245 of file RTreeNode.cpp.
{ CubitStatus stat; //we need to move up the tree and correct things that have changed. if ( l == root_node ) { if ( ll == NULL ) return CUBIT_SUCCESS; else { //Create a new root node and store l and ll there CubitBox root_box = l->bounding_box(); root_box |= ll->bounding_box(); new_root = new RTreeNode<Y>(root_box, maxChildren, minChildren); int new_level = l->get_leaf_level() + 1; new_root->set_leaf_level(new_level); new_root->add_child(l, CUBIT_TRUE); new_root->add_child(ll, CUBIT_TRUE); return CUBIT_SUCCESS; } } RTreeNode<Y> *parent_node = l->get_parent(); RTreeNode<Y> *new_group = NULL; if ( ll != NULL ) { //We need to add ll to the parent if we can, //and then we need to update the parent's bounding box... if ( parent_node->can_add() ) { parent_node->add_child(ll, CUBIT_FALSE); //we need to recalculate the bounding box for the //entire set since both l and ll were modified... parent_node->recalc_b_box(); } else { //Now we must split the children of the parent. l should //already be in the chilren list of the paretn. So send //to split node the parent_node and ll. //parent node during this process will have its b_box recalced. stat = quadratic_split_node(parent_node, ll, new_group); if ( stat != CUBIT_SUCCESS || new_group == NULL ) { PRINT_ERROR("Problems splitting node during insertion to RTree.\n"); return CUBIT_FAILURE; } } } else { //just recalulate the b_box for the parent_node. parent_node->recalc_b_box(); } stat = adjust_tree(parent_node, new_group, root_node, new_root); if ( stat != CUBIT_SUCCESS ) return CUBIT_FAILURE; return CUBIT_SUCCESS; }
CubitBox& RTreeNode< Y >::bounding_box | ( | void | ) | [inline] |
Definition at line 185 of file RTreeNode.hpp.
{return *myBoundingBox;}
MY_INLINE double RTreeNode< Y >::calc_enlargement | ( | RTreeNode< Y > * | current, |
RTreeNode< Y > * | add_to | ||
) | [private] |
Definition at line 218 of file RTreeNode.cpp.
{ //The enlargement area is the volume of the box that would //be the union of current and add_to minus the volume of the current. CubitBox curr_box = current->bounding_box(); CubitBox add_to_box = add_to->bounding_box(); CubitBox supper = curr_box; //Unite add_to_box to the curr_box. supper|= add_to_box; double area_big = volume(supper); return area_big - volume(current); }
MY_INLINE double RTreeNode< Y >::calc_enlargement | ( | CubitBox & | current, |
CubitBox & | add_to | ||
) | [private] |
Definition at line 230 of file RTreeNode.cpp.
MY_INLINE CubitBoolean RTreeNode< Y >::can_add | ( | ) |
Definition at line 439 of file RTreeNode.cpp.
{ if (nextChildIndex >= maxChildren ) return CUBIT_FALSE; else return CUBIT_TRUE; }
MY_INLINE RTreeNode< Y > * RTreeNode< Y >::choose_leaf | ( | RTreeNode< Y > * | n, |
RTreeNode< Y > * | e | ||
) | [private] |
Definition at line 168 of file RTreeNode.cpp.
{ //If n is a leaf node, or one level greater than e, //we are done. if ( n->get_leaf_level() == (e->get_leaf_level() + 1) ) return n; //Now choose the entry f in n (children of n that is) //whose bounding box f_box needs //least enlargement to include e_box. Resolve ties by //choosing the entry with the bounding box of smallest volume. double min_enlargement = CUBIT_DBL_MAX, curr_enlargement; RTreeNode<Y> *curr_node; int child_index = -1; int ii; for(ii = 0; (ii < maxChildren) && (n->myChildrenNodes[ii] != NULL); ii++ ) { curr_node = n->myChildrenNodes[ii]; curr_enlargement = calc_enlargement(curr_node, e); if ( curr_enlargement <= min_enlargement ) { if ( curr_enlargement == min_enlargement && child_index >= 0 ) { //only reset if the curr_node has a smaller volume. double curr_vol = volume(curr_node); double old_vol = volume(n->myChildrenNodes[child_index]); if ( old_vol < curr_vol ) continue; } child_index = ii; min_enlargement = curr_enlargement; } } //do error checking... if ( child_index == -1 || child_index >= maxChildren ) return (RTreeNode<Y>*)NULL; RTreeNode<Y> *f = n->myChildrenNodes[child_index]; //Now continue on... curr_node = choose_leaf(f,e); return curr_node; }
MY_INLINE CubitStatus RTreeNode< Y >::condense_tree | ( | RTreeNode< Y > * | l, |
RTreeNode< Y > * | root, | ||
RTreeNode< Y > *& | new_root | ||
) | [private] |
Definition at line 769 of file RTreeNode.cpp.
{ int ii; new_root = NULL; //CT1) RTreeNode<Y> *n = l, *p; DLIList <RTreeNode<Y>*> set_q; //CT2) while ( n != root ) { p = n->get_parent(); if ( n->num_children() < minChildren ) { //CT3 //take these children and add them to set_q. for ( ii = 0;ii < n->num_children(); ii++ ) set_q.append(n->get_child(ii)); //remove n from p. p->remove_child(n); //delete n. delete n; //now continue on. } else { //CT4 n->recalc_b_box(); } //CT5 n = p; } //now reinsert all nodes in set_q. RTreeNode<Y> *curr_node, *temp_root; temp_root = root; for (ii = set_q.size(); ii > 0; ii-- ) { curr_node = set_q.get_and_step(); temp_root->insert(curr_node, new_root); if ( new_root != NULL ) temp_root = new_root; } if ( temp_root != root ) new_root = temp_root; return CUBIT_SUCCESS; }
int RTreeNode< Y >::dist_is_box | ( | ) | [inline] |
Definition at line 197 of file RTreeNode.hpp.
{ return distIsBox; }
MY_INLINE CubitStatus RTreeNode< Y >::find_leaf | ( | Y | e, |
CubitBox & | e_box, | ||
RTreeNode< Y > * | t, | ||
RTreeNode< Y > *& | l | ||
) | [private] |
Definition at line 669 of file RTreeNode.cpp.
{ int ii; l = NULL; int loop_size = t->num_children(); RTreeNode<Y> *curr_node; if ( t->get_leaf_level() > LEAF_RNODE ) { for ( ii = 0; ii < loop_size; ii++ ) { curr_node = t->get_child(ii); if ( curr_node == NULL ) { PRINT_ERROR("Problems finding boxes in range.\n"); assert(curr_node != NULL); return CUBIT_FAILURE; } if ( e_box.overlap(GEOMETRY_RESABS, curr_node->bounding_box()) ) { //okay now search through this now. find_leaf(e, e_box,curr_node,l); if ( l != NULL ) return CUBIT_SUCCESS; } } } else if ( t->is_leaf() ) { //search through the children for e. for ( ii = 0; ii < loop_size; ii++ ) { curr_node = t->get_child(ii); if ( curr_node == NULL ) { PRINT_ERROR("Problems finding boxes in range.\n"); assert(curr_node != NULL); return CUBIT_FAILURE; } if ( curr_node->get_data() == e ) { l = curr_node; return CUBIT_SUCCESS; } } } return CUBIT_SUCCESS; }
Definition at line 415 of file RTreeNode.cpp.
{ int ii; nextChildIndex = 0; for ( ii = 0; ii < maxChildren; ii++ ) myChildrenNodes[ii] = NULL; delete myBoundingBox; myBoundingBox = new CubitBox(new_box); }
Definition at line 158 of file RTreeNode.hpp.
{return ((i < nextChildIndex) ? myChildrenNodes[i] : (RTreeNode<Y>*)NULL) ;}
Definition at line 139 of file RTreeNode.hpp.
{return myData;}
Definition at line 209 of file RTreeNode.hpp.
{ return myDist; }
int RTreeNode< Y >::get_leaf_level | ( | ) | [inline] |
Definition at line 127 of file RTreeNode.hpp.
{return myLevel;}
RTreeNode<Y>* RTreeNode< Y >::get_parent | ( | ) | [inline] |
Definition at line 170 of file RTreeNode.hpp.
{return myParent;}
MY_INLINE CubitStatus RTreeNode< Y >::insert | ( | RTreeNode< Y > * | e, |
RTreeNode< Y > *& | new_root | ||
) |
Definition at line 119 of file RTreeNode.cpp.
{ CubitStatus stat; new_root = NULL;//only set this if the root node changes. Assume //that this RTreeNode object is the root... // I1. Invoke choose_leaf to select a leaf node l in which to place //e RTreeNode<Y> *l = choose_leaf(this, e); //just test. // make sure l is not null. // make sure l is one level above e. if ( l == NULL || l->get_leaf_level() != (e->get_leaf_level() + 1) ) { PRINT_ERROR("Choosing leaf for inseartion into rtree failed.\n"); return CUBIT_FAILURE; } RTreeNode<Y> *ll = NULL; //I2 a) If l has room for another entry install e. if ( l->can_add() ) { l->add_child(e, CUBIT_TRUE); } else { //I2 b) //Otherwise invoke split_node to obtain l and ll containing e and //all the old entries of l. stat = quadratic_split_node(l,e,ll); if ( stat != CUBIT_SUCCESS || ll == NULL ) { PRINT_ERROR("Problems splitting node during insertion to RTree.\n"); return CUBIT_FAILURE; } } //I3. Propagate changes upward. //I4, grow tree taller (do both inside adjust_tree...) stat = adjust_tree(l, ll, this, new_root); if ( stat!= CUBIT_SUCCESS ) return stat; return CUBIT_SUCCESS; }
CubitBoolean RTreeNode< Y >::is_data | ( | ) | [inline] |
Definition at line 135 of file RTreeNode.hpp.
{return (myLevel == DATA_RNODE)? CUBIT_TRUE : CUBIT_FALSE;}
CubitBoolean RTreeNode< Y >::is_leaf | ( | void | ) | [inline] |
Definition at line 131 of file RTreeNode.hpp.
{return (myLevel == LEAF_RNODE)? CUBIT_TRUE : CUBIT_FALSE;}
int RTreeNode< Y >::num_children | ( | ) | [inline] |
Definition at line 154 of file RTreeNode.hpp.
{return nextChildIndex;}
MY_INLINE CubitStatus RTreeNode< Y >::pick_next | ( | DLIList< RTreeNode< Y > * > & | remaining_nodes, |
RTreeNode< Y > * | group_1, | ||
RTreeNode< Y > * | group_2, | ||
RTreeNode< Y > *& | next, | ||
CubitBoolean & | add_to_group_1 | ||
) | [private] |
Definition at line 505 of file RTreeNode.cpp.
{ int ii, next_index = 0; double d1, d2, max_diff = -CUBIT_DBL_MAX; add_to_group_1 = CUBIT_TRUE; RTreeNode<Y> *max_diff_node = (RTreeNode<Y>*)NULL; RTreeNode<Y> *curr_node; CubitBox group_1_box = group_1->bounding_box(); CubitBox group_2_box = group_2->bounding_box(); CubitBox curr_box; double v1 = volume(group_1_box); double v2 = volume(group_2_box); remaining_nodes.reset(); for ( ii = 0; ii < remaining_nodes.size(); ii++ ) { curr_node = remaining_nodes.get_and_step(); curr_box = curr_node->bounding_box(); d1 = calc_enlargement(group_1_box, curr_box); d2 = calc_enlargement(group_2_box, curr_box); if ( d1 > d2 ) { if ( max_diff < d1 - d2 ) { //add to group whose covering area would have //to be enlarged least. add_to_group_1 = CUBIT_FALSE; max_diff = d1 - d2; max_diff_node = curr_node; next_index = ii; } } else if ( d2 > d1 ) { if ( max_diff < d2 - d1 ) { //add to group whose covering area would have //to be enlarged least. add_to_group_1 = CUBIT_TRUE; max_diff = d2 - d1; max_diff_node = curr_node; next_index = ii; } } else { if ( max_diff < 0.0 ) { //Add to group with smaller area. if ( v1 < v2 ) add_to_group_1 = CUBIT_TRUE; else if ( v2 < v1 ) add_to_group_1 = CUBIT_FALSE; else { //add to group with fewest entries. int num_left_1 = group_1->space_left(); int num_left_2 = group_2->space_left(); if ( num_left_1 > num_left_2 ) add_to_group_1 = CUBIT_TRUE; else add_to_group_1 = CUBIT_FALSE; } max_diff = 0.0; max_diff_node = curr_node; next_index = ii; } } } next = NULL; if ( max_diff_node == NULL ) return CUBIT_FAILURE; else next = max_diff_node; //remove next from the remaining_nodes list. remaining_nodes.reset(); remaining_nodes.step(next_index); RTreeNode<Y> *check_node = remaining_nodes.remove(); if ( check_node != max_diff_node ) { PRINT_ERROR("Error in pick next algorithm logic of rtree..."); return CUBIT_FAILURE; } return CUBIT_SUCCESS; }
MY_INLINE CubitStatus RTreeNode< Y >::pick_seeds | ( | RTreeNode< Y > ** | input_list, |
const int | input_list_size, | ||
RTreeNode< Y > *& | seed_1, | ||
RTreeNode< Y > *& | seed_2 | ||
) | [private] |
Definition at line 460 of file RTreeNode.cpp.
{ int ii, jj; RTreeNode<Y> *e_1, *e_2; CubitBox e_box_1, e_box_2, j; double d, max_d = -CUBIT_DBL_MAX; seed_1 = (RTreeNode<Y>*)NULL; seed_2 = (RTreeNode<Y>*)NULL; for(ii = 0; ii < input_list_size; ii++ ) { e_1 = input_list[ii]; e_box_1 = e_1->bounding_box(); for ( jj = ii+1; jj < input_list_size; jj++ ) { e_2 = input_list[jj]; e_box_2 = e_2->bounding_box(); //unite the boxes. j = e_box_1; j |= e_box_2; //find the most wastefull boxes to separate the groups. d = volume(j) - volume(e_box_1) - volume(e_box_2); if ( d > max_d ) { seed_1 = e_1; seed_2 = e_2; max_d = d; } } } return CUBIT_SUCCESS; }
MY_INLINE CubitStatus RTreeNode< Y >::quadratic_split_node | ( | RTreeNode< Y > * | l, |
RTreeNode< Y > * | e, | ||
RTreeNode< Y > *& | ll | ||
) | [private] |
Definition at line 333 of file RTreeNode.cpp.
{ int ii; //create a new list containing all the nodes we want to split. RTreeNode<Y> **input_list = new RTreeNode<Y>* [maxChildren + 1]; DLIList <RTreeNode<Y>*> nodes_remaining; for ( ii = 0; ii < maxChildren; ii++ ) { input_list[ii] = l->myChildrenNodes[ii]; } input_list[maxChildren] = e; //QS1, pick first entry for each group. RTreeNode<Y> *seed_1, *seed_2; CubitStatus stat = pick_seeds(input_list, maxChildren+1,seed_1, seed_2); if ( stat != CUBIT_SUCCESS ) { delete [] input_list; return stat; } //now flush out l. This cleans out the bounding box and //chindrenNodes and resets the bounding box. Also //create ll, make l and ll non-leaf nodes and add //seed_1 and seed_2 to l and ll. (doesn't matter which...) l->flush(seed_1->bounding_box()); l->add_child(seed_1, CUBIT_FALSE); //this is still a leaf node. //this will change if necessary the parent... l->set_leaf_level(e->get_leaf_level() + 1); ll = new RTreeNode<Y>(seed_2->bounding_box(), maxChildren, minChildren ); ll->add_child(seed_2, CUBIT_FALSE); ll->set_leaf_level(l->get_leaf_level()); //build the nodes remaining list... for ( ii = 0; ii < maxChildren+1; ii++ ) { if ( input_list[ii] != seed_1 && input_list[ii] != seed_2 ) nodes_remaining.append(input_list[ii]); } delete [] input_list; RTreeNode<Y> *next_node; CubitBoolean add_to_group_1; //Q2 while (nodes_remaining.size() > 0 ) { //Q2 continued. if ( l->space_left() < minChildren && minChildren - l->space_left() >= nodes_remaining.size() ) { //just add the rest of the nodes to l. for ( ii = nodes_remaining.size(); ii > 0; ii-- ) l->add_child(nodes_remaining.get_and_step(), CUBIT_TRUE); nodes_remaining.clean_out(); break; } else if ( ll->space_left() < minChildren && minChildren - ll->space_left() >= nodes_remaining.size() ) { //just add the rest of the nodes to l. for ( ii = nodes_remaining.size(); ii > 0; ii-- ) ll->add_child(nodes_remaining.get_and_step(), CUBIT_TRUE); nodes_remaining.clean_out(); break; } //Q3 //pick next selects the next node and the group to //put it in. It also removes the node from nodes remaining. //Some of these steps were added to pick next for efficiency... stat = pick_next(nodes_remaining, l, ll, next_node, add_to_group_1 ); if ( stat != CUBIT_SUCCESS ) return stat; if ( add_to_group_1 ) l->add_child(next_node, CUBIT_TRUE); else ll->add_child(next_node, CUBIT_TRUE); } return CUBIT_SUCCESS; }
MY_INLINE void RTreeNode< Y >::recalc_b_box | ( | ) |
Definition at line 592 of file RTreeNode.cpp.
{ if(myLevel == DATA_RNODE ) return; int ii; CubitBox temp_box; CubitBoolean first_box = CUBIT_TRUE; for ( ii = 0; ii < nextChildIndex; ii++ ) { if ( first_box ) { temp_box = myChildrenNodes[ii]->bounding_box(); first_box = CUBIT_FALSE; } else temp_box |= myChildrenNodes[ii]->bounding_box(); } delete myBoundingBox; myBoundingBox = new CubitBox(temp_box); return; }
MY_INLINE CubitBoolean RTreeNode< Y >::remove | ( | Y | e, |
RTreeNode< Y > *& | new_root, | ||
CubitBoolean & | delete_root | ||
) |
Definition at line 624 of file RTreeNode.cpp.
{ //D1) Find node containting record. if(this->is_data()){ if(this->get_data() == e){ myData = NULL; myLevel = UNSET_RNODE; return CUBIT_TRUE; } else if(this->num_children() == 0){ return CUBIT_FALSE; } } RTreeNode<Y> *l = NULL; CubitBox my_box = e->bounding_box(); CubitStatus stat = find_leaf(e, my_box, this, l); if ( l == NULL || stat != CUBIT_SUCCESS ) return CUBIT_FALSE; //Now l is the RTreeNode that holds the actual data (a DATA_RNODE) //not a leaf. This was done for efficiency. RTreeNode<Y> *data_node = l; l = data_node->get_parent(); //D2) [Delete record] Remove e from l. //remove the data node from the children and delete //the node. l->remove_child(data_node); delete data_node; //D3) [Propogate Changes]. stat = condense_tree(l, this, new_root); //D4) [Shorten the tree]. RTreeNode<Y> *root = this; if ( new_root != NULL ) root = new_root; if ( root->num_children() == 1 ) { new_root = root->get_child(0); new_root->set_parent((RTreeNode<Y>*)NULL); delete_root = CUBIT_TRUE; } return CUBIT_TRUE; }
MY_INLINE CubitBoolean RTreeNode< Y >::remove_child | ( | RTreeNode< Y > * | child | ) |
Definition at line 719 of file RTreeNode.cpp.
{ //first find which item this child is at. int ii; int index_child = -1; int loop_size = this->num_children(); for ( ii = 0; ii < loop_size; ii++ ) { if ( myChildrenNodes[ii] == child ) index_child = ii; } if ( index_child == -1 ) return CUBIT_FALSE; //Now we need to bubble the array from this point //upward. for ( ii = index_child; ii < loop_size-1; ii++ ) { myChildrenNodes[ii] = myChildrenNodes[ii+1]; } //decrement the position of the next available child. nextChildIndex--; //now go from nextChildIndex to the end and make sure it is //null. for (ii = nextChildIndex; ii < maxChildren; ii++ ) myChildrenNodes[ii] = NULL; return CUBIT_TRUE; }
Definition at line 213 of file RTreeNode.hpp.
void RTreeNode< Y >::set_dist_is_box | ( | int | val | ) | [inline] |
Definition at line 201 of file RTreeNode.hpp.
void RTreeNode< Y >::set_leaf_level | ( | int | r_type | ) | [inline] |
Definition at line 124 of file RTreeNode.hpp.
{myLevel = r_type;}
void RTreeNode< Y >::set_parent | ( | RTreeNode< Y > * | parent | ) | [inline] |
Definition at line 172 of file RTreeNode.hpp.
{myParent = parent;}
MY_INLINE int RTreeNode< Y >::space_left | ( | ) |
Definition at line 446 of file RTreeNode.cpp.
{ return maxChildren - nextChildIndex; }
Definition at line 219 of file RTreeNode.hpp.
Definition at line 224 of file RTreeNode.hpp.
{ CubitBox box = curr->bounding_box(); return box.x_range()*box.y_range()*box.z_range(); }
Definition at line 29 of file RTreeNode.hpp.
IttyBit RTreeNode< Y >::markedFlag [private] |
Definition at line 28 of file RTreeNode.hpp.
int RTreeNode< Y >::maxChildren [private] |
Definition at line 35 of file RTreeNode.hpp.
int RTreeNode< Y >::minChildren [private] |
Definition at line 35 of file RTreeNode.hpp.
CubitBox* RTreeNode< Y >::myBoundingBox [private] |
Definition at line 33 of file RTreeNode.hpp.
RTreeNode<Y>** RTreeNode< Y >::myChildrenNodes [private] |
Definition at line 31 of file RTreeNode.hpp.
Definition at line 41 of file RTreeNode.hpp.
Definition at line 37 of file RTreeNode.hpp.
Definition at line 36 of file RTreeNode.hpp.
int RTreeNode< Y >::nextChildIndex [private] |
Definition at line 32 of file RTreeNode.hpp.