![]() |
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.
: bMin( DBL_MAX ), bMax( -DBL_MAX ) {}
moab::BoundBox::BoundBox | ( | const CartVect & | min, |
const CartVect & | max | ||
) | [inline] |
Definition at line 16 of file BoundBox.hpp.
: bMin( min ), bMax( max ) {}
moab::BoundBox::BoundBox | ( | const double * | corners | ) | [inline] |
Definition at line 79 of file BoundBox.hpp.
References moab::CartVect::array(), and bMin.
{
// relies on CartVect being Plain Old Data, no virtual table
double* arr = bMin.array();
for( int i = 0; i < 6; i++ )
arr[i] = corners[i];
}
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.
: bMin( from.bMin ), bMax( from.bMax ) {}
moab::BoundBox::~BoundBox | ( | ) | [inline] |
Definition at line 29 of file BoundBox.hpp.
{}
void moab::BoundBox::compute_center | ( | CartVect & | center | ) | [inline] |
Definition at line 153 of file BoundBox.hpp.
{
center = 0.5 * ( bMin + bMax );
}
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().
{
if( point[0] < bMin[0] - tol || point[0] > bMax[0] + tol || point[1] < bMin[1] - tol || point[1] > bMax[1] + tol ||
point[2] < bMin[2] - tol || point[2] > bMax[2] + tol )
return false;
else
return true;
}
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().
{
if( DBL_MAX == bMax[0] || DBL_MAX == bMax[1] || DBL_MAX == bMax[2] || DBL_MAX == bMin[0] || DBL_MAX == bMin[1] ||
DBL_MAX == bMin[2] )
return DBL_MAX;
return ( bMax - bMin ).length();
}
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.
{
if( DBL_MAX == bMax[0] || DBL_MAX == bMax[1] || DBL_MAX == bMax[2] || DBL_MAX == bMin[0] || DBL_MAX == bMin[1] ||
DBL_MAX == bMin[2] )
return DBL_MAX;
return ( bMax - bMin ).length_squared();
}
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().
{
double dist_sq = 0.0;
for( int i = 0; i < 3; ++i )
{
if( from_point[i] < bMin[i] )
dist_sq += ( bMin[i] - from_point[i] ) * ( bMin[i] - from_point[i] );
else if( from_point[i] > bMax[i] )
dist_sq += ( bMax[i] - from_point[i] ) * ( bMax[i] - from_point[i] );
}
return dist_sq;
}
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().
{
if( b.bMax[0] < bMin[0] - tol || b.bMin[0] > bMax[0] + tol || b.bMax[1] < bMin[1] - tol ||
b.bMin[1] > bMax[1] + tol || b.bMax[2] < bMin[2] - tol || b.bMin[2] > bMax[2] + tol )
return false;
else
return true;
}
Definition at line 65 of file BoundBox.hpp.
{
bMin = from.bMin;
bMax = from.bMax;
return *this;
}
bool moab::BoundBox::operator== | ( | const BoundBox & | box | ) | const [inline] |
Definition at line 71 of file BoundBox.hpp.
{
return ( bMin == box.bMin && bMax == box.bMax );
}
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] |
Definition at line 167 of file BoundBox.hpp.
References update().
{
Range tmp_range( ent, ent );
return update( iface, tmp_range, spherical, radius );
}
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().
{
bMax[0] = std::max( bMax[0], other_box.bMax[0] );
bMax[1] = std::max( bMax[1], other_box.bMax[1] );
bMax[2] = std::max( bMax[2], other_box.bMax[2] );
}
void moab::BoundBox::update_max | ( | const double * | coords | ) | [inline] |
Definition at line 139 of file BoundBox.hpp.
References bMax.
{
bMax[0] = std::max( bMax[0], coords[0] );
bMax[1] = std::max( bMax[1], coords[1] );
bMax[2] = std::max( bMax[2], coords[2] );
}
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().
{
bMin[0] = std::min( bMin[0], other_box.bMin[0] );
bMin[1] = std::min( bMin[1], other_box.bMin[1] );
bMin[2] = std::min( bMin[2], other_box.bMin[2] );
}
void moab::BoundBox::update_min | ( | const double * | coords | ) | [inline] |
Definition at line 125 of file BoundBox.hpp.
References bMin.
{
bMin[0] = std::min( bMin[0], coords[0] );
bMin[1] = std::min( bMin[1], coords[1] );
bMin[2] = std::min( bMin[2], coords[2] );
}
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().