Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
Iterate over leaves of a BSPTree. More...
#include <BSPTree.hpp>
Classes | |
struct | Corners |
Public Types | |
enum | SideBits { B0154 = 0x33, B1265 = 0x66, B2376 = 0xCC, B3047 = 0x99, B3210 = 0x0F, B4567 = 0xF0 } |
Faces of a hex : corner bitmap. More... | |
enum | XSect { MISS = 0, SPLIT = 1, NONHEX = -1 } |
test if a plane intersects the leaf box More... | |
Public Member Functions | |
BSPTreeBoxIter () | |
virtual | ~BSPTreeBoxIter () |
virtual ErrorCode | step (Direction direction) |
Advance the iterator either left or right in the tree Note: stepping past the end of the tree will invalidate the iterator. It will *not* work to subsequently step the other direction. | |
ErrorCode | step () |
Advance to next leaf Returns MB_ENTITY_NOT_FOUND if at end. Note: stepping past the end of the tree will invalidate the iterator. Calling back() will not work. | |
ErrorCode | back () |
Move back to previous leaf Returns MB_ENTITY_NOT_FOUND if at beginning. Note: stepping past the start of the tree will invalidate the iterator. Calling step() will not work. | |
ErrorCode | get_box_corners (double coords[8][3]) const |
Get coordinates of box corners, in Exodus II hexahedral ordering. | |
double | volume () const |
Get volume of leaf box. | |
XSect | splits (const BSPTree::Plane &plane) const |
bool | intersects (const BSPTree::Plane &plane) const |
test if a plane intersects the leaf box | |
bool | intersect_ray (const double ray_point[3], const double ray_vect[3], double &t_enter, double &t_exit) const |
Find range of overlap between ray and leaf. | |
ErrorCode | sibling_side (SideBits &side_out) const |
Return the side of the box bounding this tree node that is shared with the immediately adjacent sibling (the tree node that shares a common parent node with this node in the binary tree.) | |
ErrorCode | get_neighbors (SideBits side, std::vector< BSPTreeBoxIter > &results, double epsilon=0.0) const |
Get adjacent leaf nodes on indicated side. | |
ErrorCode | calculate_polyhedron (BSPTreePoly &polyhedron_out) const |
Calculate the convex polyhedron bounding this leaf. | |
Static Public Member Functions | |
static SideBits | side_above_plane (const double hex_coords[8][3], const BSPTree::Plane &plane) |
static SideBits | side_on_plane (const double hex_coords[8][3], const BSPTree::Plane &plane) |
static SideBits | opposite_face (const SideBits &bits) |
static ErrorCode | face_corners (const SideBits face, const double hex_corners[8][3], double face_corners_out[4][3]) |
Protected Member Functions | |
virtual ErrorCode | step_to_first_leaf (Direction direction) |
virtual ErrorCode | up () |
virtual ErrorCode | down (const BSPTree::Plane &plane, Direction direction) |
virtual ErrorCode | initialize (BSPTree *tool, EntityHandle root, const double *point=0) |
Private Attributes | |
double | leafCoords [8][3] |
std::vector< Corners > | stackData |
Iterate over leaves of a BSPTree.
Definition at line 369 of file BSPTree.hpp.
Faces of a hex : corner bitmap.
Definition at line 392 of file BSPTree.hpp.
{ B0154 = 0x33, //!< Face defined by corners {0,1,5,4}: 1st Exodus side B1265 = 0x66, //!< Face defined by corners {1,2,6,5}: 2nd Exodus side B2376 = 0xCC, //!< Face defined by corners {2,3,7,6}: 3rd Exodus side B3047 = 0x99, //!< Face defined by corners {3,0,4,7}: 4th Exodus side B3210 = 0x0F, //!< Face defined by corners {3,2,1,0}: 5th Exodus side B4567 = 0xF0 //!< Face defined by corners {4,5,6,7}: 6th Exodus side };
test if a plane intersects the leaf box
Definition at line 444 of file BSPTree.hpp.
moab::BSPTreeBoxIter::BSPTreeBoxIter | ( | ) | [inline] |
Definition at line 388 of file BSPTree.hpp.
{}
virtual moab::BSPTreeBoxIter::~BSPTreeBoxIter | ( | ) | [inline, virtual] |
Definition at line 389 of file BSPTree.hpp.
{}
ErrorCode moab::BSPTreeBoxIter::back | ( | ) | [inline] |
Move back to previous leaf Returns MB_ENTITY_NOT_FOUND if at beginning. Note: stepping past the start of the tree will invalidate the iterator. Calling step() will not work.
Reimplemented from moab::BSPTreeIter.
Definition at line 432 of file BSPTree.hpp.
{ return BSPTreeIter::back(); }
ErrorCode moab::BSPTreeBoxIter::calculate_polyhedron | ( | BSPTreePoly & | polyhedron_out | ) | const [virtual] |
Calculate the convex polyhedron bounding this leaf.
Reimplemented from moab::BSPTreeIter.
Definition at line 1129 of file BSPTree.cpp.
References leafCoords, and moab::BSPTreePoly::set().
{ const CartVect* ptr = reinterpret_cast< const CartVect* >( leafCoords ); return poly_out.set( ptr ); }
ErrorCode moab::BSPTreeBoxIter::down | ( | const BSPTree::Plane & | plane, |
Direction | direction | ||
) | [protected, virtual] |
Reimplemented from moab::BSPTreeIter.
Definition at line 827 of file BSPTree.cpp.
References moab::BSPTreeIter::childVect, moab::BSPTreeBoxIter::Corners::coords, ErrorCode, moab::BSPTree::Plane::flip(), moab::Interface::get_child_meshsets(), leafCoords, MB_ENTITY_NOT_FOUND, MB_SUCCESS, moab::BSPTree::moab(), moab::BSPTreeIter::mStack, moab::plane_cut_box(), moab::BSPTreeIter::RIGHT, stackData, and moab::BSPTreeIter::tool().
Referenced by get_neighbors().
{ childVect.clear(); ErrorCode rval = tool()->moab()->get_child_meshsets( mStack.back(), childVect ); if( MB_SUCCESS != rval ) return rval; if( childVect.empty() ) return MB_ENTITY_NOT_FOUND; BSPTree::Plane plane( plane_ref ); if( direction == RIGHT ) plane.flip(); Corners clipped_face; rval = plane_cut_box( clipped_face.coords, leafCoords, plane ); if( MB_SUCCESS != rval ) return rval; mStack.push_back( childVect[direction] ); stackData.push_back( clipped_face ); return MB_SUCCESS; }
ErrorCode moab::BSPTreeBoxIter::face_corners | ( | const SideBits | face, |
const double | hex_corners[8][3], | ||
double | face_corners_out[4][3] | ||
) | [static] |
Definition at line 587 of file BSPTree.cpp.
References B0154, B1265, B2376, B3047, B3210, B4567, moab::copy_coords(), and MB_SUCCESS.
Referenced by get_neighbors().
{ switch( face ) { case BSPTreeBoxIter::B0154: copy_coords( hex_corners[0], face_corners[0] ); copy_coords( hex_corners[1], face_corners[1] ); copy_coords( hex_corners[5], face_corners[2] ); copy_coords( hex_corners[4], face_corners[3] ); break; case BSPTreeBoxIter::B1265: copy_coords( hex_corners[1], face_corners[0] ); copy_coords( hex_corners[2], face_corners[1] ); copy_coords( hex_corners[6], face_corners[2] ); copy_coords( hex_corners[5], face_corners[3] ); break; case BSPTreeBoxIter::B2376: copy_coords( hex_corners[2], face_corners[0] ); copy_coords( hex_corners[3], face_corners[1] ); copy_coords( hex_corners[7], face_corners[2] ); copy_coords( hex_corners[6], face_corners[3] ); break; case BSPTreeBoxIter::B3047: copy_coords( hex_corners[3], face_corners[0] ); copy_coords( hex_corners[0], face_corners[1] ); copy_coords( hex_corners[4], face_corners[2] ); copy_coords( hex_corners[7], face_corners[3] ); break; case BSPTreeBoxIter::B3210: copy_coords( hex_corners[3], face_corners[0] ); copy_coords( hex_corners[2], face_corners[1] ); copy_coords( hex_corners[1], face_corners[2] ); copy_coords( hex_corners[0], face_corners[3] ); break; case BSPTreeBoxIter::B4567: copy_coords( hex_corners[4], face_corners[0] ); copy_coords( hex_corners[5], face_corners[1] ); copy_coords( hex_corners[6], face_corners[2] ); copy_coords( hex_corners[7], face_corners[3] ); break; default: return MB_FAILURE; // child is not a box } return MB_SUCCESS; }
ErrorCode moab::BSPTreeBoxIter::get_box_corners | ( | double | coords[8][3] | ) | const |
Get coordinates of box corners, in Exodus II hexahedral ordering.
Definition at line 907 of file BSPTree.cpp.
References leafCoords, and MB_SUCCESS.
{ memcpy( coords, leafCoords, 24 * sizeof( double ) ); return MB_SUCCESS; }
ErrorCode moab::BSPTreeBoxIter::get_neighbors | ( | SideBits | side, |
std::vector< BSPTreeBoxIter > & | results, | ||
double | epsilon = 0.0 |
||
) | const |
Get adjacent leaf nodes on indicated side.
side | Face of box for which to retrieve neighbors |
results | List to which to append results. This function does *not* clear existing values in list. |
epsilon | Tolerance on overlap. A positive value E will result in nodes that are separated by as much as E to be considered touching. A negative value -E will cause leaves that do not overlap by at least E to be considered non-overlapping. Amongst other things, this value can be used to control whether or not leaves adjacent at only their edges or corners are returned. |
Definition at line 1024 of file BSPTree.cpp.
References moab::BSPTreeIter::childVect, moab::BSPTreeBoxIter::Corners::coords, down(), ErrorCode, face_corners(), moab::Interface::get_child_meshsets(), moab::BSPTree::get_split_plane(), moab::BSPTreeIter::handle(), leafCoords, moab::BSPTreeIter::LEFT, MB_ENTITY_NOT_FOUND, MB_SUCCESS, moab::BSPTree::moab(), moab::Interface::num_child_meshsets(), opposite_face(), moab::BSPTreeIter::RIGHT, side_above_plane(), moab::BSPTree::Plane::signed_distance(), moab::BSPTreeIter::tool(), and up().
{ EntityHandle tmp_handle; BSPTree::Plane plane; ErrorCode rval; int n; Corners face; rval = face_corners( side, leafCoords, face.coords ); if( MB_SUCCESS != rval ) return rval; // Move up tree until we find the split that created the specified side. // Push the sibling at that level onto the iterator stack as // all neighbors will be rooted at that node. BSPTreeBoxIter iter( *this ); // temporary iterator (don't modifiy *this) for( ;; ) { tmp_handle = iter.handle(); rval = iter.up(); if( MB_SUCCESS != rval ) // reached root - no neighbors on that side return ( rval == MB_ENTITY_NOT_FOUND ) ? MB_SUCCESS : rval; iter.childVect.clear(); rval = tool()->moab()->get_child_meshsets( iter.handle(), iter.childVect ); if( MB_SUCCESS != rval ) return rval; rval = tool()->get_split_plane( iter.handle(), plane ); if( MB_SUCCESS != rval ) return rval; SideBits s = side_above_plane( iter.leafCoords, plane ); if( tmp_handle == iter.childVect[0] && s == side ) { rval = iter.down( plane, RIGHT ); if( MB_SUCCESS != rval ) return rval; break; } else if( tmp_handle == iter.childVect[1] && opposite_face( s ) == side ) { rval = iter.down( plane, LEFT ); if( MB_SUCCESS != rval ) return rval; break; } } // now move down tree, searching for adjacent boxes std::vector< BSPTreeBoxIter > list; // loop over all potential paths to neighbors (until list is empty) for( ;; ) { // follow a single path to a leaf, append any other potential // paths to neighbors to 'list' for( ;; ) { rval = tool()->moab()->num_child_meshsets( iter.handle(), &n ); if( MB_SUCCESS != rval ) return rval; // if leaf if( !n ) { results.push_back( iter ); break; } rval = tool()->get_split_plane( iter.handle(), plane ); if( MB_SUCCESS != rval ) return rval; bool some_above = false, some_below = false; for( int i = 0; i < 4; ++i ) { double signed_d = plane.signed_distance( face.coords[i] ); if( signed_d > -epsilon ) some_above = true; if( signed_d < epsilon ) some_below = true; } if( some_above && some_below ) { list.push_back( iter ); list.back().down( plane, RIGHT ); iter.down( plane, LEFT ); } else if( some_above ) { iter.down( plane, RIGHT ); } else if( some_below ) { iter.down( plane, LEFT ); } else { // tolerance issue -- epsilon to small? 2D box? return MB_FAILURE; } } if( list.empty() ) break; iter = list.back(); list.pop_back(); } return MB_SUCCESS; }
ErrorCode moab::BSPTreeBoxIter::initialize | ( | BSPTree * | tool, |
EntityHandle | root, | ||
const double * | point = 0 |
||
) | [protected, virtual] |
Reimplemented from moab::BSPTreeIter.
Definition at line 547 of file BSPTree.cpp.
References ErrorCode, moab::BSPTree::get_tree_box(), leafCoords, MB_ENTITY_NOT_FOUND, MB_SUCCESS, moab::point_in_box(), stackData, and moab::BSPTreeIter::tool().
{ ErrorCode rval = BSPTreeIter::initialize( tool_ptr, root ); if( MB_SUCCESS != rval ) return rval; rval = tool()->get_tree_box( root, leafCoords ); if( MB_SUCCESS != rval ) return rval; if( point && !point_in_box( leafCoords, point ) ) return MB_ENTITY_NOT_FOUND; stackData.resize( 1 ); return MB_SUCCESS; }
bool moab::BSPTreeBoxIter::intersect_ray | ( | const double | ray_point[3], |
const double | ray_vect[3], | ||
double & | t_enter, | ||
double & | t_exit | ||
) | const [virtual] |
Find range of overlap between ray and leaf.
ray_point | Coordinates of start point of ray |
ray_vect | Directionion vector for ray such that the ray is defined by r(t) = ray_point + t * ray_vect for t > 0. |
t_enter | Output: if return value is true, this value is the parameter location along the ray at which the ray entered the leaf. If return value is false, then this value is undefined. |
t_exit | Output: if return value is true, this value is the parameter location along the ray at which the ray exited the leaf. If return value is false, then this value is undefined. |
Reimplemented from moab::BSPTreeIter.
Definition at line 1267 of file BSPTree.cpp.
References leafCoords, and moab::ray_intersect_halfspaces().
{ BoxPlaneIter iter( this->leafCoords ), end; return ray_intersect_halfspaces( CartVect( ray_point ), CartVect( ray_vect ), iter, end, t_enter, t_exit ); }
bool moab::BSPTreeBoxIter::intersects | ( | const BSPTree::Plane & | plane | ) | const |
test if a plane intersects the leaf box
Definition at line 1001 of file BSPTree.cpp.
References moab::BSPTree::Plane::above(), and leafCoords.
{ // test each corner relative to the plane unsigned count = 0; for( unsigned i = 0; i < 8u; ++i ) count += plane.above( leafCoords[i] ); return count > 0 && count < 8u; }
static SideBits moab::BSPTreeBoxIter::opposite_face | ( | const SideBits & | bits | ) | [inline, static] |
Definition at line 406 of file BSPTree.hpp.
Referenced by get_neighbors().
{ return (SideBits)( ( ~bits ) & 0xFF ); }
ErrorCode moab::BSPTreeBoxIter::sibling_side | ( | SideBits & | side_out | ) | const |
Return the side of the box bounding this tree node that is shared with the immediately adjacent sibling (the tree node that shares a common parent node with this node in the binary tree.)
Definition at line 1010 of file BSPTree.cpp.
References ErrorCode, moab::BSPTree::get_split_plane(), leafCoords, MB_ENTITY_NOT_FOUND, MB_SUCCESS, moab::BSPTreeIter::mStack, side_on_plane(), and moab::BSPTreeIter::tool().
{ if( mStack.size() < 2 ) // at tree root return MB_ENTITY_NOT_FOUND; EntityHandle parent = mStack[mStack.size() - 2]; BSPTree::Plane plane; ErrorCode rval = tool()->get_split_plane( parent, plane ); if( MB_SUCCESS != rval ) return MB_FAILURE; side_out = side_on_plane( leafCoords, plane ); return MB_SUCCESS; }
BSPTreeBoxIter::SideBits moab::BSPTreeBoxIter::side_above_plane | ( | const double | hex_coords[8][3], |
const BSPTree::Plane & | plane | ||
) | [static] |
Definition at line 561 of file BSPTree.cpp.
References moab::BSPTree::Plane::above().
Referenced by get_neighbors(), and moab::plane_cut_box().
{ unsigned result = 0; for( unsigned i = 0; i < 8u; ++i ) result |= plane.above( hex_coords[i] ) << i; return (BSPTreeBoxIter::SideBits)result; }
BSPTreeBoxIter::SideBits moab::BSPTreeBoxIter::side_on_plane | ( | const double | hex_coords[8][3], |
const BSPTree::Plane & | plane | ||
) | [static] |
Definition at line 569 of file BSPTree.cpp.
References moab::BSPTree::Plane::distance(), and moab::BSPTree::epsilon().
Referenced by moab::plane_uncut_box(), and sibling_side().
{ unsigned result = 0; for( unsigned i = 0; i < 8u; ++i ) { bool on = plane.distance( hex_coords[i] ) <= BSPTree::epsilon(); result |= on << i; } return (BSPTreeBoxIter::SideBits)result; }
BSPTreeBoxIter::XSect moab::BSPTreeBoxIter::splits | ( | const BSPTree::Plane & | plane | ) | const |
Definition at line 961 of file BSPTree.cpp.
References B0154, B1265, B2376, B3047, B3210, B4567, moab::BSPTree::epsilon(), leafCoords, MISS, NONHEX, moab::BSPTree::Plane::signed_distance(), and SPLIT.
{ // test each corner relative to the plane unsigned result = 0; for( unsigned i = 0; i < 8u; ++i ) { double d = plane.signed_distance( leafCoords[i] ); // if corner is on plane, than intersection // will result in a degenerate hex if( fabs( d ) < BSPTree::epsilon() ) return NONHEX; // if mark vertices above plane if( d > 0.0 ) result |= 1 << i; } switch( result ) { // if all vertices or no vertices above plane, // then plane doesn't intersect case 0: case 0xFF: return MISS; // if there are four vertices above the plane // and they compose a single face of the hex, // then the cut will result in two hexes case B0154: case B1265: case B2376: case B3047: case B3210: case B4567: return SPLIT; // otherwise intersects, but split would not result // in two hexahedrons default: return NONHEX; } }
ErrorCode moab::BSPTreeBoxIter::step | ( | Direction | direction | ) | [virtual] |
Advance the iterator either left or right in the tree Note: stepping past the end of the tree will invalidate the iterator. It will *not* work to subsequently step the other direction.
Reimplemented from moab::BSPTreeIter.
Definition at line 846 of file BSPTree.cpp.
References moab::BSPTreeIter::childVect, moab::BSPTreeBoxIter::Corners::coords, ErrorCode, moab::BSPTree::Plane::flip(), moab::Interface::get_child_meshsets(), moab::BSPTree::get_split_plane(), leafCoords, moab::BSPTreeIter::LEFT, MB_ENTITY_NOT_FOUND, MB_SUCCESS, moab::BSPTree::moab(), moab::BSPTreeIter::mStack, moab::plane_cut_box(), moab::plane_uncut_box(), stackData, step_to_first_leaf(), and moab::BSPTreeIter::tool().
{ EntityHandle node, parent; Corners clipped_face; ErrorCode rval; BSPTree::Plane plane; const Direction opposite = static_cast< Direction >( 1 - direction ); // If stack is empty, then either this iterator is uninitialized // or we reached the end of the iteration (and return // MB_ENTITY_NOT_FOUND) already. if( mStack.empty() ) return MB_FAILURE; // Pop the current node from the stack. // The stack should then contain the parent of the current node. // If the stack is empty after this pop, then we've reached the end. node = mStack.back(); mStack.pop_back(); clipped_face = stackData.back(); stackData.pop_back(); while( !mStack.empty() ) { // Get data for parent entity parent = mStack.back(); childVect.clear(); rval = tool()->moab()->get_child_meshsets( parent, childVect ); if( MB_SUCCESS != rval ) return rval; rval = tool()->get_split_plane( parent, plane ); if( MB_SUCCESS != rval ) return rval; if( direction == LEFT ) plane.flip(); // If we're at the left child if( childVect[opposite] == node ) { // change from box of left child to box of parent plane_uncut_box( clipped_face.coords, leafCoords, plane ); // change from box of parent to box of right child plane.flip(); plane_cut_box( clipped_face.coords, leafCoords, plane ); // push right child on stack mStack.push_back( childVect[direction] ); stackData.push_back( clipped_face ); // descend to left-most leaf of the right child return step_to_first_leaf( opposite ); } // The current node is the right child of the parent, // continue up the tree. assert( childVect[direction] == node ); plane.flip(); plane_uncut_box( clipped_face.coords, leafCoords, plane ); node = parent; clipped_face = stackData.back(); mStack.pop_back(); stackData.pop_back(); } return MB_ENTITY_NOT_FOUND; }
ErrorCode moab::BSPTreeBoxIter::step | ( | ) | [inline] |
Advance to next leaf Returns MB_ENTITY_NOT_FOUND if at end. Note: stepping past the end of the tree will invalidate the iterator. Calling back() will not work.
Reimplemented from moab::BSPTreeIter.
Definition at line 423 of file BSPTree.hpp.
{ return BSPTreeIter::step(); }
ErrorCode moab::BSPTreeBoxIter::step_to_first_leaf | ( | Direction | direction | ) | [protected, virtual] |
Reimplemented from moab::BSPTreeIter.
Definition at line 771 of file BSPTree.cpp.
References moab::BSPTreeIter::childVect, moab::BSPTreeBoxIter::Corners::coords, ErrorCode, moab::BSPTree::Plane::flip(), moab::Interface::get_child_meshsets(), moab::BSPTree::get_split_plane(), leafCoords, MB_SUCCESS, moab::BSPTree::moab(), moab::BSPTreeIter::mStack, moab::plane_cut_box(), moab::BSPTreeIter::RIGHT, stackData, and moab::BSPTreeIter::tool().
Referenced by step().
{ ErrorCode rval; BSPTree::Plane plane; Corners clipped_corners; for( ;; ) { childVect.clear(); rval = tool()->moab()->get_child_meshsets( mStack.back(), childVect ); if( MB_SUCCESS != rval ) return rval; if( childVect.empty() ) // leaf break; rval = tool()->get_split_plane( mStack.back(), plane ); if( MB_SUCCESS != rval ) return rval; if( direction == RIGHT ) plane.flip(); rval = plane_cut_box( clipped_corners.coords, leafCoords, plane ); if( MB_SUCCESS != rval ) return rval; mStack.push_back( childVect[direction] ); stackData.push_back( clipped_corners ); } return MB_SUCCESS; }
ErrorCode moab::BSPTreeBoxIter::up | ( | ) | [protected, virtual] |
Reimplemented from moab::BSPTreeIter.
Definition at line 797 of file BSPTree.cpp.
References moab::BSPTreeBoxIter::Corners::coords, ErrorCode, moab::BSPTree::get_split_plane(), leafCoords, MB_ENTITY_NOT_FOUND, MB_SUCCESS, moab::BSPTreeIter::mStack, moab::plane_uncut_box(), stackData, and moab::BSPTreeIter::tool().
Referenced by get_neighbors().
{ ErrorCode rval; if( mStack.size() == 1 ) return MB_ENTITY_NOT_FOUND; EntityHandle node = mStack.back(); Corners clipped_face = stackData.back(); mStack.pop_back(); stackData.pop_back(); BSPTree::Plane plane; rval = tool()->get_split_plane( mStack.back(), plane ); if( MB_SUCCESS != rval ) { mStack.push_back( node ); stackData.push_back( clipped_face ); return rval; } rval = plane_uncut_box( clipped_face.coords, leafCoords, plane ); if( MB_SUCCESS != rval ) { mStack.push_back( node ); stackData.push_back( clipped_face ); return rval; } return MB_SUCCESS; }
double moab::BSPTreeBoxIter::volume | ( | ) | const [virtual] |
Get volume of leaf box.
Reimplemented from moab::BSPTreeIter.
Definition at line 942 of file BSPTree.cpp.
References moab::cross(), moab::dot(), leafCoords, moab::subtr(), and moab::sum().
{ // have planar sides, so use mid-face tripple product double f1[3], f2[3], f3[3], f4[3], f5[3], f6[3]; sum( f1, leafCoords[0], leafCoords[1], leafCoords[4], leafCoords[5] ); sum( f2, leafCoords[1], leafCoords[2], leafCoords[5], leafCoords[6] ); sum( f3, leafCoords[2], leafCoords[3], leafCoords[6], leafCoords[7] ); sum( f4, leafCoords[0], leafCoords[3], leafCoords[4], leafCoords[7] ); sum( f5, leafCoords[0], leafCoords[1], leafCoords[2], leafCoords[3] ); sum( f6, leafCoords[4], leafCoords[5], leafCoords[6], leafCoords[7] ); double v13[3], v24[3], v65[3]; subtr( v13, f1, f3 ); subtr( v24, f2, f4 ); subtr( v65, f6, f5 ); double cr[3]; cross( cr, v13, v24 ); return ( 1. / 64 ) * dot( cr, v65 ); }
double moab::BSPTreeBoxIter::leafCoords[8][3] [private] |
Definition at line 372 of file BSPTree.hpp.
Referenced by calculate_polyhedron(), down(), get_box_corners(), get_neighbors(), initialize(), intersect_ray(), intersects(), sibling_side(), splits(), step(), step_to_first_leaf(), up(), and volume().
std::vector< Corners > moab::BSPTreeBoxIter::stackData [private] |
Definition at line 377 of file BSPTree.hpp.
Referenced by down(), initialize(), step(), step_to_first_leaf(), and up().