Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
#include <BoundBox.hpp>
Public Member Functions | |
BoundBox () | |
BoundBox (const CartVect &min, const CartVect &max) | |
BoundBox (const double *corners) | |
BoundBox (std::vector< CartVect > points) | |
BoundBox (const BoundBox &from) | |
~BoundBox () | |
bool | contains_point (const double *point, const double tol=0.0) const |
bool | intersects_box (const BoundBox &b, const double tol=0.0) const |
void | compute_center (CartVect ¢er) |
void | update (const BoundBox &other_box) |
void | update (const double *coords) |
ErrorCode | update (Interface &iface, const Range &elems, bool spherical=false, double radius=1.) |
ErrorCode | update (Interface &iface, const EntityHandle ent, bool spherical=false, double radius=1.) |
void | update_min (const BoundBox &other_box) |
void | update_min (const double *coords) |
void | update_max (const BoundBox &other_box) |
void | update_max (const double *coords) |
ErrorCode | get (double *coords) |
void | update_box_spherical_elem (const CartVect *coordverts, int len, double radius) |
double | diagonal_length () const |
Return the diagonal length of this box. | |
double | diagonal_squared () const |
Return the square of the diagonal length of this box. | |
double | distance_squared (const double *from_point) const |
Return square of distance from box, or zero if inside. | |
double | distance (const double *from_point) const |
Return distance from box, or zero if inside. | |
BoundBox & | operator= (const BoundBox &from) |
bool | operator== (const BoundBox &box) const |
Public Attributes | |
CartVect | bMin |
CartVect | bMax |
Definition at line 12 of file BoundBox.hpp.
moab::BoundBox::BoundBox | ( | ) | [inline] |
Definition at line 15 of file BoundBox.hpp.
moab::BoundBox::BoundBox | ( | const CartVect & | min, |
const CartVect & | max | ||
) | [inline] |
Definition at line 16 of file BoundBox.hpp.
moab::BoundBox::BoundBox | ( | const double * | corners | ) | [inline] |
Definition at line 79 of file BoundBox.hpp.
References moab::CartVect::array(), and bMin.
moab::BoundBox::BoundBox | ( | std::vector< CartVect > | points | ) | [inline] |
Definition at line 19 of file BoundBox.hpp.
References update_max(), and update_min().
: bMin( DBL_MAX ), bMax( -DBL_MAX ) { for( size_t i = 0; i < points.size(); i++ ) { update_min( points[i].array() ); update_max( points[i].array() ); } }
moab::BoundBox::BoundBox | ( | const BoundBox & | from | ) | [inline] |
Definition at line 27 of file BoundBox.hpp.
moab::BoundBox::~BoundBox | ( | ) | [inline] |
Definition at line 29 of file BoundBox.hpp.
{}
void moab::BoundBox::compute_center | ( | CartVect & | center | ) | [inline] |
bool moab::BoundBox::contains_point | ( | const double * | point, |
const double | tol = 0.0 |
||
) | const [inline] |
Definition at line 87 of file BoundBox.hpp.
Referenced by moab::AdaptiveKDTree::distance_search(), moab::Element::Map::inside_box(), moab::AdaptiveKDTree::point_search(), and moab::BVHTree::point_search().
double moab::BoundBox::diagonal_length | ( | ) | const [inline] |
Return the diagonal length of this box.
Definition at line 192 of file BoundBox.hpp.
Referenced by moab::LloydSmoother::perform_smooth(), and moab::Coupler::test_local_box().
double moab::BoundBox::diagonal_squared | ( | ) | const [inline] |
Return the square of the diagonal length of this box.
Definition at line 200 of file BoundBox.hpp.
double moab::BoundBox::distance | ( | const double * | from_point | ) | const [inline] |
Return distance from box, or zero if inside.
from_point | Point from which you want distance |
Definition at line 186 of file BoundBox.hpp.
References distance_squared().
Referenced by moab::Coupler::locate_points().
{ double dist_sq = distance_squared( from_point ); return sqrt( dist_sq ); }
double moab::BoundBox::distance_squared | ( | const double * | from_point | ) | const [inline] |
Return square of distance from box, or zero if inside.
from_point | Point from which you want distance_sq |
Definition at line 173 of file BoundBox.hpp.
Referenced by distance(), and moab::BVHTree::distance_search().
ErrorCode moab::BoundBox::get | ( | double * | coords | ) | [inline] |
Definition at line 146 of file BoundBox.hpp.
References bMax, bMin, moab::CartVect::get(), and MB_SUCCESS.
{ bMin.get( coords ); bMax.get( coords + 3 ); return MB_SUCCESS; }
bool moab::BoundBox::intersects_box | ( | const BoundBox & | b, |
const double | tol = 0.0 |
||
) | const [inline] |
Definition at line 96 of file BoundBox.hpp.
Referenced by moab::BVHTree::build_tree(), moab::BVHTree::establish_buckets(), moab::BVHTree::find_split(), moab::BVHTree::initialize_splits(), moab::BVHTree::local_build_tree(), and moab::BVHTree::median_order().
bool moab::BoundBox::operator== | ( | const BoundBox & | box | ) | const [inline] |
void moab::BoundBox::update | ( | const BoundBox & | other_box | ) | [inline] |
Definition at line 106 of file BoundBox.hpp.
References update_max(), and update_min().
Referenced by moab::AdaptiveKDTree::build_tree(), moab::BVHTree::build_tree(), moab::BVHTree::construct_element_vec(), DeformMeshRemap::deform_master(), moab::BVHTree::establish_buckets(), moab::Tree::find_all_trees(), moab::BVHTree::find_split(), moab::ParallelMergeMesh::GetGlobalBox(), moab::BVHTree::initialize_splits(), moab::AdaptiveKDTree::intersect_children_with_elems(), moab::BVHTree::median_order(), moab::LloydSmoother::perform_smooth(), moab::BVHTree::set_interval(), and update().
{ update_min( other_box ); update_max( other_box ); }
void moab::BoundBox::update | ( | const double * | coords | ) | [inline] |
Definition at line 112 of file BoundBox.hpp.
References update_max(), and update_min().
{ update_min( coords ); update_max( coords + 3 ); }
ErrorCode moab::BoundBox::update | ( | Interface & | iface, |
const Range & | elems, | ||
bool | spherical = false , |
||
double | radius = 1. |
||
) |
Definition at line 9 of file BoundBox.cpp.
References moab::CartVect::array(), moab::Range::begin(), bMax, bMin, moab::Range::end(), ErrorCode, moab::Interface::get_connectivity(), moab::Interface::get_coords(), moab::Interface::get_entities_by_handle(), moab::Range::lower_bound(), MB_SUCCESS, MBEDGE, MBENTITYSET, MBPOLYHEDRON, update(), update_box_spherical_elem(), update_max(), and update_min().
{ ErrorCode rval; bMin = CartVect( HUGE_VAL ); bMax = CartVect( -HUGE_VAL ); CartVect coords; EntityHandle const *conn = NULL, *conn2 = NULL; int len = 0, len2 = 0; Range::const_iterator i; CartVect coordverts[27]; // maximum nodes per element supported by MOAB // vertices const Range::const_iterator elem_begin = elems.lower_bound( MBEDGE ); for( i = elems.begin(); i != elem_begin; ++i ) { rval = iface.get_coords( &*i, 1, coords.array() ); if( MB_SUCCESS != rval ) return rval; update_min( coords.array() ); update_max( coords.array() ); } // elements with vertex-handle connectivity list const Range::const_iterator poly_begin = elems.lower_bound( MBPOLYHEDRON, elem_begin ); std::vector< EntityHandle > dum_vector; for( i = elem_begin; i != poly_begin; ++i ) { rval = iface.get_connectivity( *i, conn, len, true, &dum_vector ); if( MB_SUCCESS != rval ) return rval; rval = iface.get_coords( conn, len, &( coordverts[0][0] ) ); if( MB_SUCCESS != rval ) return rval; for( int j = 0; j < len; ++j ) { update_min( coordverts[j].array() ); update_max( coordverts[j].array() ); } // if spherical, use gnomonic projection to improve the computed box // it is used now for coupling only if( spherical ) update_box_spherical_elem( coordverts, len, radius ); } // polyhedra const Range::const_iterator set_begin = elems.lower_bound( MBENTITYSET, poly_begin ); for( i = poly_begin; i != set_begin; ++i ) { rval = iface.get_connectivity( *i, conn, len, true ); if( MB_SUCCESS != rval ) return rval; for( int j = 0; j < len; ++j ) { rval = iface.get_connectivity( conn[j], conn2, len2 ); if( MB_SUCCESS != rval ) return rval; rval = iface.get_coords( conn2, len2, &( coordverts[0][0] ) ); if( MB_SUCCESS != rval ) return rval; for( int k = 0; k < len2; ++k ) { update_min( coordverts[k].array() ); update_max( coordverts[k].array() ); } } } // sets BoundBox box; for( i = set_begin; i != elems.end(); ++i ) { Range tmp_elems; rval = iface.get_entities_by_handle( *i, tmp_elems ); if( MB_SUCCESS != rval ) return rval; rval = box.update( iface, tmp_elems, spherical, radius ); if( MB_SUCCESS != rval ) return rval; update( box ); } return MB_SUCCESS; }
ErrorCode moab::BoundBox::update | ( | Interface & | iface, |
const EntityHandle | ent, | ||
bool | spherical = false , |
||
double | radius = 1. |
||
) | [inline] |
void moab::BoundBox::update_box_spherical_elem | ( | const CartVect * | coordverts, |
int | len, | ||
double | radius | ||
) |
in case of spherical elements, account for curvature if needed
Definition at line 87 of file BoundBox.cpp.
References moab::CartVect::array(), moab::IntxUtils::decide_gnomonic_plane(), moab::IntxUtils::gnomonic_projection(), moab::IntxUtils::reverse_gnomonic_projection(), update_max(), and update_min().
Referenced by update().
{ // decide first the gnomonic plane, based on first coordinate int plane = -1; CartVect pos; IntxUtils::decide_gnomonic_plane( verts[0], plane ); double in_plane_positions[20]; // at most polygons with 10 edges; do we need to revise this? for( int i = 0; i < len && i < 10; i++ ) IntxUtils::gnomonic_projection( verts[i], R, plane, in_plane_positions[2 * i], in_plane_positions[2 * i + 1] ); // look for points on the intersection between edges in gnomonic plane and coordinate axes // if yes, reverse projection of intx point, and update box double oriented_area2 = 0; // if oriented area is != zero, it means the origin is inside the polygon, so we need to upgrade // the box with the origin, so we do not miss anything (the top of the dome) for( int i = 0; i < len; i++ ) { int i1 = ( i + 1 ) % len; // next vertex in polygon // check intx with x axis double ax = in_plane_positions[2 * i], ay = in_plane_positions[2 * i + 1]; double bx = in_plane_positions[2 * i1], by = in_plane_positions[2 * i1 + 1]; if( ay * by < 0 ) // it intersects with x axis { double alfa = ay / ( ay - by ); double xintx = ax + alfa * ( bx - ax ); IntxUtils::reverse_gnomonic_projection( xintx, 0, R, plane, pos ); update_min( pos.array() ); update_max( pos.array() ); } if( ax * bx < 0 ) // it intersects with y axis { double alfa = ax / ( ax - bx ); double yintx = ay + alfa * ( by - ay ); IntxUtils::reverse_gnomonic_projection( 0, yintx, R, plane, pos ); update_min( pos.array() ); update_max( pos.array() ); } oriented_area2 += ( ax * by - ay * bx ); } if( fabs( oriented_area2 ) > R * R * 1.e-6 ) // origin is in the interior, add the center { IntxUtils::reverse_gnomonic_projection( 0, 0, R, plane, pos ); update_min( pos.array() ); update_max( pos.array() ); } }
void moab::BoundBox::update_max | ( | const BoundBox & | other_box | ) | [inline] |
Definition at line 132 of file BoundBox.hpp.
References bMax.
Referenced by BoundBox(), update(), and update_box_spherical_elem().
void moab::BoundBox::update_max | ( | const double * | coords | ) | [inline] |
void moab::BoundBox::update_min | ( | const BoundBox & | other_box | ) | [inline] |
Definition at line 118 of file BoundBox.hpp.
References bMin.
Referenced by BoundBox(), update(), and update_box_spherical_elem().
void moab::BoundBox::update_min | ( | const double * | coords | ) | [inline] |
Definition at line 76 of file BoundBox.hpp.
Referenced by moab::BVHTree::Bucket::bucket_index(), moab::AdaptiveKDTree::build_tree(), moab::BVHTree::build_tree(), compute_center(), contains_point(), moab::Tree::create_root(), DeformMeshRemap::deform_master(), diagonal_length(), diagonal_squared(), moab::AdaptiveKDTree::distance_search(), distance_squared(), get(), moab::AdaptiveKDTree::get_info(), moab::ParallelMergeMesh::GetGlobalBox(), moab::BVHTree::initialize_splits(), moab::Coupler::initialize_tree(), moab::AdaptiveKDTree::intersect_children_with_elems(), intersects_box(), main(), moab::BVHTree::median_order(), moab::operator<<(), operator=(), operator==(), moab::AdaptiveKDTree::point_search(), moab::AdaptiveKDTree::print(), moab::AdaptiveKDTree::ray_intersect_triangles(), update(), and update_max().
Definition at line 76 of file BoundBox.hpp.
Referenced by BoundBox(), moab::BVHTree::Bucket::bucket_index(), moab::AdaptiveKDTree::build_tree(), moab::BVHTree::build_tree(), compute_center(), contains_point(), moab::Tree::create_root(), deform_func(), DeformMeshRemap::deform_master(), diagonal_length(), diagonal_squared(), moab::AdaptiveKDTree::distance_search(), distance_squared(), get(), moab::AdaptiveKDTree::get_info(), moab::BVHTree::initialize_splits(), moab::Coupler::initialize_tree(), moab::AdaptiveKDTree::intersect_children_with_elems(), intersects_box(), main(), moab::BVHTree::median_order(), moab::operator<<(), operator=(), operator==(), moab::AdaptiveKDTree::point_search(), moab::AdaptiveKDTree::print(), moab::AdaptiveKDTree::ray_intersect_triangles(), update(), and update_min().