cgma
|
#include <OctTreeCell.hpp>
Public Types | |
enum | { X_MIN = 0, Y_MIN = 0, Z_MIN = 0, X_MAX = 1, Y_MAX = 2, Z_MAX = 4 } |
Public Member Functions | |
OctTreeCell (OctTreeEntry< X, E > array[], int size) | |
OctTreeCell () | |
bool | leaf () const |
bool | split (const CubitVector &my_center, OctTreeCell< X, E > *memory) |
void | append_nodes (DLIList< X * > &list) |
void | append_all_nodes (DLIList< X * > &list) |
OctTreeCell< X, E > * | child (int quadrant) |
void | node_locations (CubitVector &box_min, CubitVector &box_max, CubitVector &average, CubitVector *std_dev=0) |
int | node_count () |
Private Member Functions | |
void | add_nodes (OctTreeEntry< X, E > *node) |
Private Attributes | |
union { | |
OctTreeEntry< X, E > * head_ | |
OctTreeCell< X, E > * children_ | |
}; | |
int | node_count_ |
Definition at line 29 of file OctTreeCell.hpp.
anonymous enum |
OctTreeCell< X, E >::OctTreeCell | ( | OctTreeEntry< X, E > | array[], |
int | size | ||
) |
Definition at line 18 of file OctTreeCell.cpp.
: node_count_(size) { children_ = 0; OctTreeEntry<X,E>** prev_ptr_ptr = &head_; for( int i = 0; i < node_count_; i++ ) { OctTreeEntry<X,E>* entry = array + i; *prev_ptr_ptr = entry; prev_ptr_ptr = &(entry->next); } *prev_ptr_ptr = 0; }
OctTreeCell< X, E >::OctTreeCell | ( | ) | [inline] |
Definition at line 62 of file OctTreeCell.hpp.
: children_(0), node_count_(0) {}
void OctTreeCell< X, E >::add_nodes | ( | OctTreeEntry< X, E > * | node | ) | [private] |
Definition at line 55 of file OctTreeCell.cpp.
{ assert( leaf() ); OctTreeEntry<X,E>* last = node; int count = 1; while( last->next ) { count++; last = last->next; } last->next = head_; head_ = node; node_count_ += count; }
void OctTreeCell< X, E >::append_all_nodes | ( | DLIList< X * > & | list | ) |
Definition at line 41 of file OctTreeCell.cpp.
{ if( node_count_ ) { append_nodes( list ); } else if( children_ ) { for( int i = 0; i < 8; i++ ) children_[i].append_all_nodes( list ); } }
void OctTreeCell< X, E >::append_nodes | ( | DLIList< X * > & | list | ) |
Definition at line 33 of file OctTreeCell.cpp.
{ OctTreeEntry<X,E>* entry = node_count_ ? head_ : 0; for( ; entry; entry = entry->next ) list.append( entry->node ); }
OctTreeCell< X, E > * OctTreeCell< X, E >::child | ( | int | quadrant | ) |
Definition at line 73 of file OctTreeCell.cpp.
{ assert( quadrant >= 0 && quadrant < 8 && !node_count_ ); if( children_ ) return children_ + quadrant; else return 0; }
bool OctTreeCell< X, E >::leaf | ( | ) | const [inline] |
Definition at line 66 of file OctTreeCell.hpp.
{ return node_count_ || !children_; }
int OctTreeCell< X, E >::node_count | ( | ) | [inline] |
Definition at line 114 of file OctTreeCell.hpp.
{ return node_count_; }
void OctTreeCell< X, E >::node_locations | ( | CubitVector & | box_min, |
CubitVector & | box_max, | ||
CubitVector & | average, | ||
CubitVector * | std_dev = 0 |
||
) |
Definition at line 115 of file OctTreeCell.cpp.
{ if( !node_count_ ) return; double x_min, y_min, z_min; double x_max, y_max, z_max; double x_avg, y_avg, z_avg; CubitVector coords = E::coordinates( head_->node ); x_min = x_max = x_avg = coords.x(); y_min = y_max = y_avg = coords.y(); z_min = z_max = z_avg = coords.z(); for( OctTreeEntry<X,E>* entry = head_->next; entry; entry = entry->next ) { X* node = entry->node; coords = E::coordinates( node ); double x = coords.x(); if( x < x_min ) x_min = x; else if ( x > x_max ) x_max = x; x_avg += x; double y = coords.y(); if( y < y_min ) y_min = y; else if ( y > y_max ) y_max = y; y_avg += y; double z = coords.z(); if( z < z_min ) z_min = z; else if ( z > z_max ) z_max = z; z_avg += z; } box_min.set( x_min, y_min, z_min ); box_max.set( x_max, y_max, z_max ); double inv = 1.0 / node_count_; x_avg *= inv; y_avg *= inv; z_avg *= inv; average.set( x_avg, y_avg, z_avg ); if( std_dev ) { X* hn = head_->node; coords = E::coordinates(hn); double x_dev = (coords.x() - x_avg) * (coords.x() - x_avg); double y_dev = (coords.y() - y_avg) * (coords.y() - y_avg); double z_dev = (coords.z() - z_avg) * (coords.z() - z_avg); for( OctTreeEntry<X,E>* entry = head_->next; entry; entry = entry->next ) { X* node = entry->node; coords = E::coordinates(node); double x = coords.x(); double dx = x - x_avg; x_dev += dx * dx; double y = coords.y(); double dy = y - y_avg; y_dev += dy * dy; double z = coords.z(); double dz = z - z_avg; z_dev += dz * dz; } inv = 1.0 / ( node_count_ - 1 ); x_dev = sqrt(x_dev * inv); y_dev = sqrt(y_dev * inv); z_dev = sqrt(z_dev * inv); std_dev->set( x_dev, y_dev, z_dev ); } }
bool OctTreeCell< X, E >::split | ( | const CubitVector & | my_center, |
OctTreeCell< X, E > * | memory | ||
) |
Definition at line 83 of file OctTreeCell.cpp.
{ assert( leaf() ); bool result = false; if( node_count_ > 3 ) { // Data is a union. Make sure you never change // the order of the following two lines! OctTreeEntry<X,E>* node = head_; children_ = storage; while( node ) { CubitVector coords = E::coordinates(node->node); int x = coords.x() < my_center.x() ? X_MIN : X_MAX; int y = coords.y() < my_center.y() ? Y_MIN : Y_MAX; int z = coords.z() < my_center.z() ? Z_MIN : Z_MAX; OctTreeEntry<X,E>* next = node->next; node->next = 0; children_[x|y|z].add_nodes( node ); node = next; } result = true; node_count_ = 0; } return result; }
union { ... } [private] |
OctTreeCell<X,E>* OctTreeCell< X, E >::children_ |
Definition at line 35 of file OctTreeCell.hpp.
OctTreeEntry<X,E>* OctTreeCell< X, E >::head_ |
Definition at line 34 of file OctTreeCell.hpp.
int OctTreeCell< X, E >::node_count_ [private] |
Definition at line 44 of file OctTreeCell.hpp.