MOAB: Mesh Oriented datABase
(version 5.4.1)
|
#include "moab/Core.hpp"
#include "TestUtil.hpp"
#include "moab/BSPTree.hpp"
#include "moab/CartVect.hpp"
#include "moab/BSPTreePoly.hpp"
#include "moab/Range.hpp"
#include <algorithm>
Go to the source code of this file.
Defines | |
#define | CHECK_RAY_XSECTS(PT, DIR, T_IN, T_OUT) |
Functions | |
void | test_set_plane () |
void | test_iterator () |
void | test_box_iterator () |
void | test_tree_create () |
void | test_box_tree_create () |
void | test_leaf_containing_point_bounded_tree () |
void | test_leaf_containing_point_unbounded_tree () |
void | test_merge_leaf () |
void | test_box_iter_neighbors () |
void | test_leaf_sibling () |
void | test_leaf_volume (bool box) |
void | test_leaf_volume_box () |
void | test_leaf_volume_gen () |
void | test_leaf_splits_intersects () |
void | test_leaf_intersects_ray_common (bool box) |
void | test_box_leaf_intersects_ray () |
void | test_gen_leaf_intersects_ray () |
void | test_leaf_polyhedron () |
int | main () |
void | check_equal (const BSPTree::Plane &p1, const BSPTree::Plane &p2, const char *exp1, const char *exp2, int line, const char *file) |
bool | compare_hexes (const double expected[8][3], const double actual[8][3], double epsilon) |
static void | aabox_corners (const double min[3], const double max[3], double corners[8][3]) |
static void | aabox_corners (double min_x, double min_y, double min_z, double max_x, double max_y, double max_z, double corners[8][3]) |
static std::vector< int > | neighbors (const BSPTreeBoxIter &iter, const EntityHandle leaves[8], BSPTreeBoxIter::SideBits side, double epsilon) |
static void | box (const double pts[], int num_pts, double minpt[3], double maxpt[3]) |
static EntityHandle | build_tree (const double points[], int num_points, BSPTree &tool) |
#define CHECK_RAY_XSECTS | ( | PT, | |
DIR, | |||
T_IN, | |||
T_OUT | |||
) |
do \ { \ CHECK( iter.intersect_ray( ( PT ), ( DIR ), t_in, t_out ) ); \ CHECK_REAL_EQUAL( ( T_IN ), t_in, 1e-6 ); \ CHECK_REAL_EQUAL( ( T_OUT ), t_out, 1e-6 ); \ } while( false )
Definition at line 1515 of file bsp_tree_test.cpp.
Referenced by test_leaf_intersects_ray_common().
static void aabox_corners | ( | const double | min[3], |
const double | max[3], | ||
double | corners[8][3] | ||
) | [static] |
Definition at line 222 of file bsp_tree_test.cpp.
Referenced by aabox_corners(), test_box_iterator(), test_box_tree_create(), test_leaf_containing_point_bounded_tree(), and test_merge_leaf().
{ const double expt[8][3] = { { min[0], min[1], min[2] }, { max[0], min[1], min[2] }, { max[0], max[1], min[2] }, { min[0], max[1], min[2] }, { min[0], min[1], max[2] }, { max[0], min[1], max[2] }, { max[0], max[1], max[2] }, { min[0], max[1], max[2] } }; memcpy( corners, expt, sizeof( expt ) ); }
static void aabox_corners | ( | double | min_x, |
double | min_y, | ||
double | min_z, | ||
double | max_x, | ||
double | max_y, | ||
double | max_z, | ||
double | corners[8][3] | ||
) | [static] |
Definition at line 230 of file bsp_tree_test.cpp.
References aabox_corners().
{ double min[] = { min_x, min_y, min_z }; double max[] = { max_x, max_y, max_z }; aabox_corners( min, max, corners ); }
static void box | ( | const double | pts[], |
int | num_pts, | ||
double | minpt[3], | ||
double | maxpt[3] | ||
) | [static] |
Definition at line 1668 of file bsp_tree_test.cpp.
Referenced by moab::BVHTree::bruteforce_find(), moab::AdaptiveKDTree::build_tree(), moab::BVHTree::build_tree(), moab::Bvh_tree< _Entity_handles, _Box, _Moab, _Parametrizer >::build_tree(), build_tree(), moab::common_tree::construct_element_map(), moab::BVHTree::construct_element_vec(), DeformMeshRemap::deform_master(), moab::BVHTree::distance_search(), moab::AdaptiveKDTree::distance_search(), do_closest_point_test(), do_ray_fire_test(), moab::Bvh_tree< _Entity_handles, _Box, _Moab, _Parametrizer >::establish_buckets(), moab::BVHTree::establish_buckets(), moab::AdaptiveKDTree::get_info(), moab::AdaptiveKDTree::get_last_iterator(), moab::AdaptiveKDTree::get_tree_iterator(), moab::ParallelMergeMesh::GetGlobalBox(), moab::Coupler::initialize_tree(), moab::Element::Map::inside_box(), TriStats::leaf(), LeafHexer::leaf(), moab::BVHTree::local_build_tree(), moab::Coupler::locate_points(), main(), moab::common_tree::operator<<(), moab::AdaptiveKDTree::point_search(), moab::BVHTree::point_search(), moab::AdaptiveKDTree::print(), moab::TreeNodePrinter::print_geometry(), moab::AdaptiveKDTree::ray_intersect_triangles(), moab::ScdInterface::remove_box(), moab::BVHTree::set_interval(), moab::Bvh_tree< _Entity_handles, _Box, _Moab, _Parametrizer >::set_interval(), moab::ScdInterface::tag_shared_vertices(), test_bound_box(), test_build_from_pts(), test_build_from_tri(), moab::Coupler::test_local_box(), test_locator(), test_save(), TriStats::TriStats(), moab::BoundBox::update(), TriCounter::visit(), TreeValidator::visit(), and CubitWriter::visit().
{ minpt[0] = maxpt[0] = pts[0]; minpt[1] = maxpt[1] = pts[1]; minpt[2] = maxpt[2] = pts[2]; for( int i = 1; i < num_pts; ++i ) { for( int d = 0; d < 3; ++d ) { if( pts[3 * i + d] < minpt[d] ) minpt[d] = pts[3 * i + d]; if( pts[3 * i + d] > maxpt[d] ) maxpt[d] = pts[3 * i + d]; } } }
static EntityHandle build_tree | ( | const double | points[], |
int | num_points, | ||
BSPTree & | tool | ||
) | [static] |
Definition at line 1683 of file bsp_tree_test.cpp.
References moab::Interface::add_entities(), moab::CartVect::array(), moab::Range::begin(), box(), CHECK, CHECK_ERR, moab::BSPTree::create_tree(), moab::Interface::create_vertex(), moab::Range::end(), ErrorCode, moab::Interface::get_coords(), moab::Interface::get_entities_by_handle(), moab::BSPTree::get_tree_iterator(), moab::BSPTreeIter::handle(), leaf, moab::BSPTree::leaf_containing_point(), length_squared(), MB_ENTITY_NOT_FOUND, MB_SUCCESS, moab::BSPTree::moab(), moab::CartVect::normalize(), moab::BSPTree::split_leaf(), and moab::BSPTreeIter::step().
Referenced by main(), and test_leaf_polyhedron().
{ // create points ErrorCode rval; std::vector< EntityHandle > pts( num_points ); for( int i = 0; i < num_points; ++i ) { rval = tool.moab()->create_vertex( points + 3 * i, pts[i] );CHECK_ERR( rval ); } // calculate bounding box of tree double minpt[3], maxpt[3]; box( points, num_points, minpt, maxpt ); // create initial (1-node) tree EntityHandle root; rval = tool.create_tree( minpt, maxpt, root );CHECK_ERR( rval ); BSPTreeIter iter; rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); rval = tool.moab()->add_entities( root, &pts[0], pts.size() );CHECK_ERR( rval ); // build tree std::vector< EntityHandle > left_pts, right_pts; std::vector< CartVect > coords( num_points ), tmp_coords; for( ; MB_SUCCESS == rval; rval = iter.step() ) { pts.clear(); rval = tool.moab()->get_entities_by_handle( iter.handle(), pts );CHECK_ERR( rval ); while( pts.size() > 1 ) { coords.resize( pts.size() ); rval = tool.moab()->get_coords( &pts[0], pts.size(), coords[0].array() );CHECK_ERR( rval ); // find two points far apart apart std::vector< CartVect >* ptr; if( coords.size() < 10 ) ptr = &coords; else { tmp_coords.resize( 16 ); CartVect pn, px; box( coords[0].array(), coords.size(), pn.array(), px.array() ); tmp_coords[8] = pn; tmp_coords[9] = CartVect( px[0], pn[1], pn[2] ); tmp_coords[10] = CartVect( px[0], px[1], pn[2] ); tmp_coords[11] = CartVect( pn[0], px[1], pn[2] ); tmp_coords[12] = CartVect( pn[0], pn[1], px[2] ); tmp_coords[13] = CartVect( px[0], pn[1], px[2] ); tmp_coords[14] = px; tmp_coords[15] = CartVect( pn[0], px[1], px[2] ); for( int i = 0; i < 8; ++i ) { tmp_coords[i] = coords[0]; for( size_t j = 1; j < coords.size(); ++j ) if( ( coords[j] - tmp_coords[i + 8] ).length_squared() < ( tmp_coords[i] - tmp_coords[i + 8] ).length_squared() ) tmp_coords[i] = coords[j]; } tmp_coords.resize( 8 ); ptr = &tmp_coords; } size_t pt1 = 0, pt2 = 0; double lsqr = -1; for( size_t i = 0; i < ptr->size(); ++i ) { for( size_t j = 0; j < ptr->size(); ++j ) { double ls = ( ( *ptr )[i] - ( *ptr )[j] ).length_squared(); if( ls > lsqr ) { lsqr = ls; pt1 = i; pt2 = j; } } } // if all points are coincident if( lsqr <= 1e-12 ) break; // define normal orthogonal to line through two points CartVect norm = ( *ptr )[pt1] - ( *ptr )[pt2]; norm.normalize(); // find mean position for plane double coeff = 0.0; for( size_t i = 0; i < coords.size(); ++i ) coeff -= norm % coords[i]; coeff /= coords.size(); // left/right sort points left_pts.clear(); right_pts.clear(); for( size_t i = 0; i < coords.size(); ++i ) { double d = -( norm % coords[i] ); if( d >= coeff ) left_pts.push_back( pts[i] ); else right_pts.push_back( pts[i] ); } rval = tool.split_leaf( iter, BSPTree::Plane( norm.array(), coeff ), left_pts, right_pts );CHECK_ERR( rval ); CHECK( !left_pts.empty() && !right_pts.empty() ); pts.swap( left_pts ); } // printf("Leaf %d contains %d vertices: ", (int)ID_FROM_HANDLE(iter.handle()), // (int)(pts.size()) ); // for (size_t i = 0; i < pts.size(); ++i) // printf( "%d, ", (int)ID_FROM_HANDLE(pts[i])); // printf("\n"); } CHECK( rval == MB_ENTITY_NOT_FOUND ); // verify that tree is constructed correctly for( int i = 0; i < num_points; ++i ) { CartVect pt( points + 3 * i ); EntityHandle leaf; rval = tool.leaf_containing_point( root, pt.array(), leaf );CHECK_ERR( rval ); Range ents; rval = tool.moab()->get_entities_by_handle( leaf, ents );CHECK_ERR( rval ); bool found = false; for( Range::iterator j = ents.begin(); j != ents.end(); ++j ) { CartVect ent_coords; rval = tool.moab()->get_coords( &*j, 1, ent_coords.array() );CHECK_ERR( rval ); if( ( pt - ent_coords ).length_squared() < 1e-6 ) found = true; } CHECK( found ); } return root; }
void check_equal | ( | const BSPTree::Plane & | p1, |
const BSPTree::Plane & | p2, | ||
const char * | exp1, | ||
const char * | exp2, | ||
int | line, | ||
const char * | file | ||
) |
Definition at line 67 of file bsp_tree_test.cpp.
References moab::BSPTree::Plane::coeff, FLAG_ERROR, and moab::BSPTree::Plane::norm.
Referenced by check_equal(), and check_equal_eigvect().
{ if( fabs( p1.norm[0] - p2.norm[0] ) > 1e-6 || fabs( p1.norm[1] - p2.norm[1] ) > 1e-6 || fabs( p1.norm[2] - p2.norm[2] ) > 1e-6 || fabs( p1.coeff - p2.coeff ) > 1e-6 ) { printf( "Equality Test Failed: %s == %s\n", exp1, exp2 ); printf( " at line %d of '%s'\n", line, file ); printf( " Expected: %f x + %f y + %f z + %f = 0\n", p1.norm[0], p1.norm[1], p1.norm[2], p1.coeff ); printf( " Actual : %f x + %f y + %f z + %f = 0\n", p2.norm[0], p2.norm[1], p2.norm[2], p2.coeff ); printf( "\n" ); FLAG_ERROR; } }
bool compare_hexes | ( | const double | expected[8][3], |
const double | actual[8][3], | ||
double | epsilon | ||
) |
Definition at line 181 of file bsp_tree_test.cpp.
Referenced by test_box_iterator(), test_box_tree_create(), test_leaf_containing_point_bounded_tree(), and test_merge_leaf().
{ // for each of three possible rotations const int rotation_maps[3][8] = { { 0, 1, 2, 3, 4, 5, 6, 7 }, { 3, 2, 6, 7, 0, 1, 5, 4 }, { 7, 3, 2, 6, 4, 0, 1, 5 } }; for( int i = 0; i < 3; ++i ) { // compare for rotationts about axis from face 4 to 5 for( int j = 0; j < 4; ++j ) { bool match = true; // for each face vertex for( int k = 0; k < 4 && match; ++k ) { // for each coordinate for( int d = 0; d < 3; ++d ) { if( fabs( expected[( j + k ) % 4][d] - actual[rotation_maps[i][k]][d] ) > epsilon || fabs( expected[( j + k ) % 4 + 4][d] - actual[rotation_maps[i][k + 4]][d] ) > epsilon ) { match = false; break; } } } if( match ) return true; } } printf( "Hex vertex copmarison failed.\n" ); printf( " Exected Actual\n" ); for( int v = 0; v < 8; ++v ) { printf( "% 9f % 9f % 9f % 9f % 9f % 9f\n", expected[v][0], expected[v][1], expected[v][2], actual[v][0], actual[v][1], actual[v][2] ); } return false; }
int main | ( | ) |
Definition at line 42 of file bsp_tree_test.cpp.
References RUN_TEST, test_box_iter_neighbors(), test_box_iterator(), test_box_leaf_intersects_ray(), test_box_tree_create(), test_gen_leaf_intersects_ray(), test_iterator(), test_leaf_containing_point_bounded_tree(), test_leaf_containing_point_unbounded_tree(), test_leaf_polyhedron(), test_leaf_sibling(), test_leaf_splits_intersects(), test_leaf_volume_box(), test_leaf_volume_gen(), test_merge_leaf(), test_set_plane(), and test_tree_create().
{ int failures = 0; failures += RUN_TEST( test_set_plane ); failures += RUN_TEST( test_iterator ); failures += RUN_TEST( test_box_iterator ); failures += RUN_TEST( test_tree_create ); failures += RUN_TEST( test_box_tree_create ); failures += RUN_TEST( test_leaf_containing_point_bounded_tree ); failures += RUN_TEST( test_leaf_containing_point_unbounded_tree ); failures += RUN_TEST( test_merge_leaf ); failures += RUN_TEST( test_box_iter_neighbors ); failures += RUN_TEST( test_leaf_sibling ); failures += RUN_TEST( test_leaf_volume_box ); failures += RUN_TEST( test_leaf_volume_gen ); failures += RUN_TEST( test_leaf_splits_intersects ); failures += RUN_TEST( test_box_leaf_intersects_ray ); failures += RUN_TEST( test_gen_leaf_intersects_ray ); failures += RUN_TEST( test_leaf_polyhedron ); return failures; }
static std::vector< int > neighbors | ( | const BSPTreeBoxIter & | iter, |
const EntityHandle | leaves[8], | ||
BSPTreeBoxIter::SideBits | side, | ||
double | epsilon | ||
) | [static] |
Definition at line 972 of file bsp_tree_test.cpp.
References CHECK_ERR, ErrorCode, and moab::BSPTreeBoxIter::get_neighbors().
Referenced by MetisPartitioner::assemble_graph(), ZoltanPartitioner::assemble_graph(), MetisPartitioner::assemble_taggedsets_graph(), moab::Intx2Mesh::DetermineOrderedNeighbors(), get_part_boundary_verts(), iMeshP_getNumPartNborsArr(), moab::Intx2Mesh::intersect_meshes(), ZoltanPartitioner::partition_owned_cells(), test_box_iter_neighbors(), test_entity_copy_parts(), and test_get_neighbors().
{ std::vector< BSPTreeBoxIter > list; ErrorCode rval = iter.get_neighbors( side, list, epsilon );CHECK_ERR( rval ); std::vector< int > results; for( size_t i = 0; i < list.size(); ++i ) results.push_back( std::find( leaves, leaves + 8, list[i].handle() ) - leaves ); std::sort( results.begin(), results.end() ); return results; }
void test_box_iter_neighbors | ( | ) |
Definition at line 987 of file bsp_tree_test.cpp.
References moab::BSPTreeBoxIter::B0154, moab::BSPTreeBoxIter::B1265, moab::BSPTreeBoxIter::B2376, moab::BSPTreeBoxIter::B3047, moab::BSPTreeBoxIter::B3210, moab::BSPTreeBoxIter::B4567, CHECK_EQUAL, CHECK_ERR, moab::BSPTree::create_tree(), ErrorCode, moab::BSPTree::get_tree_iterator(), moab::BSPTreeIter::handle(), neighbors(), moab::BSPTree::split_leaf(), and moab::BSPTreeBoxIter::step().
Referenced by main().
{ Core moab; BSPTree tool( &moab ); ErrorCode rval; EntityHandle root; BSPTreeBoxIter iter; BSPTree::Plane p; /* Build Tree */ const double corners[8][3] = { { 0, 0, 0 }, { 8, 0, 0 }, { 8, 2, 0 }, { 0, 2, 0 }, { 0, 0, 1 }, { 8, 0, 1 }, { 8, 2, 1 }, { 0, 2, 1 } }; rval = tool.create_tree( corners, root );CHECK_ERR( rval ); rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); EntityHandle leaves[8]; /* +----------------------------------------+ | | | 0* | | | +----------------------------------------+ */ p = BSPTree::Plane( 1, 0, 0, -4 ); rval = tool.split_leaf( iter, p );CHECK_ERR( rval ); /* +-------------------+--------------------+ | | | | 0* | 1 | | | | +----------------------------------------+ */ p = BSPTree::Plane( -1, 0, 0, 2 ); rval = tool.split_leaf( iter, p );CHECK_ERR( rval ); /* +---------+---------+--------------------+ | | | | | 1 | 0* | 2 | | | | | +----------------------------------------+ */ p = BSPTree::Plane( 0, 1, 0, -1 ); rval = tool.split_leaf( iter, p );CHECK_ERR( rval ); /* +---------+---------+--------------------+ | | 1 | | | 2 +---------+ 3 | | | 0* | | +----------------------------------------+ */ leaves[0] = iter.handle(); rval = iter.step();CHECK_ERR( rval ); leaves[1] = iter.handle(); rval = iter.step();CHECK_ERR( rval ); /* +---------+---------+--------------------+ | | 1 | | | 2* +---------+ 3 | | | 0 | | +----------------------------------------+ */ p = BSPTree::Plane( 0, -1, 0, 1 ); rval = tool.split_leaf( iter, p );CHECK_ERR( rval ); /* +---------+---------+--------------------+ | 2* | 1 | | +---------+---------+ 4 | | 3 | 0 | | +----------------------------------------+ */ leaves[2] = iter.handle(); rval = iter.step();CHECK_ERR( rval ); leaves[3] = iter.handle(); rval = iter.step();CHECK_ERR( rval ); /* +---------+---------+--------------------+ | 2 | 1 | | +---------+---------+ 4* | | 3 | 0 | | +----------------------------------------+ */ p = BSPTree::Plane( 0, 1, 0, -1 ); rval = tool.split_leaf( iter, p );CHECK_ERR( rval ); /* +---------+---------+--------------------+ | 2 | 1 | 5 | +---------+---------+--------------------+ | 3 | 0 | 4* | +----------------------------------------+ */ p = BSPTree::Plane( 1, 0, 0, -6 ); rval = tool.split_leaf( iter, p );CHECK_ERR( rval ); /* +---------+---------+--------------------+ | 2 | 1 | 6 | +---------+---------+----------+---------+ | 3 | 0 | 4* | 5 | +------------------------------+---------+ */ leaves[4] = iter.handle(); rval = iter.step();CHECK_ERR( rval ); leaves[5] = iter.handle(); rval = iter.step();CHECK_ERR( rval ); /* +---------+---------+--------------------+ | 2 | 1 | 6* | +---------+---------+----------+---------+ | 3 | 0 | 4 | 5 | +------------------------------+---------+ */ p = BSPTree::Plane( -1, 0, 0, 6 ); rval = tool.split_leaf( iter, p );CHECK_ERR( rval ); /* +---------+---------+--------------------+ | 2 | 1 | 7 | 6 | +---------+---------+----------+---------+ | 3 | 0 | 4 | 5 | +------------------------------+---------+ */ leaves[6] = iter.handle(); rval = iter.step();CHECK_ERR( rval ); leaves[7] = iter.handle(); /* check all neighbors of each leaf */ rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); // NOTE: Several values in the expected result list are // commented out in the tests below. When the tolerance // is greater than zero, the search algorithm may or may // not return leaves that are not face-adjacent (e.g. adjacent // only along edges or at corners.) The determining factor // for whether or not such a neighbor is returned is which // sub-tree of the split that defined the source leaf side // the neighbor is on. The algorithm will not search the subtree // of the split that created the side and that contains the // source leaf. // check neighbors of leaf 0 std::vector< int > expected; CHECK_EQUAL( leaves[0], iter.handle() ); expected.clear(); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B0154, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3210, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B4567, 1e-6 ) ); expected.push_back( 3 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3047, -1e-6 ) ); expected.insert( expected.begin(), 2 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3047, 1e-6 ) ); expected.clear(); expected.push_back( 1 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B2376, -1e-6 ) ); // See NOTE // expected.push_back( 2 ); expected.push_back( 7 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B2376, 1e-6 ) ); expected.clear(); expected.push_back( 4 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B1265, -1e-6 ) ); expected.push_back( 7 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B1265, 1e-6 ) ); // check neighbors of leaf 1 CHECK_ERR( iter.step() ); CHECK_EQUAL( leaves[1], iter.handle() ); expected.clear(); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B2376, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3210, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B4567, 1e-6 ) ); expected.push_back( 2 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3047, -1e-6 ) ); expected.push_back( 3 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3047, 1e-6 ) ); expected.clear(); expected.push_back( 0 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B0154, -1e-6 ) ); // See NOTE // expected.push_back( 3 ); expected.push_back( 4 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B0154, 1e-6 ) ); expected.clear(); expected.push_back( 7 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B1265, -1e-6 ) ); expected.insert( expected.begin(), 4 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B1265, 1e-6 ) ); /* +---------+---------+--------------------+ | 2 | 1 | 7 | 6 | +---------+---------+----------+---------+ | 3 | 0 | 4 | 5 | +------------------------------+---------+ */ // check neighbors of leaf 2 CHECK_ERR( iter.step() ); CHECK_EQUAL( leaves[2], iter.handle() ); expected.clear(); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B2376, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3047, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3210, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B4567, 1e-6 ) ); expected.push_back( 3 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B0154, -1e-6 ) ); // See NOTE // expected.insert( expected.begin(), 0 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B0154, 1e-6 ) ); expected.clear(); expected.push_back( 1 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B1265, -1e-6 ) ); expected.insert( expected.begin(), 0 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B1265, 1e-6 ) ); // check neighbors of leaf 3 CHECK_ERR( iter.step() ); CHECK_EQUAL( leaves[3], iter.handle() ); expected.clear(); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B0154, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3047, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3210, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B4567, 1e-6 ) ); expected.push_back( 2 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B2376, -1e-6 ) ); // See NOTE // expected.insert( expected.begin(), 1 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B2376, 1e-6 ) ); expected.clear(); expected.push_back( 0 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B1265, -1e-6 ) ); expected.push_back( 1 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B1265, 1e-6 ) ); /* +---------+---------+--------------------+ | 2 | 1 | 7 | 6 | +---------+---------+----------+---------+ | 3 | 0 | 4 | 5 | +------------------------------+---------+ */ // check neighbors of leaf 4 CHECK_ERR( iter.step() ); CHECK_EQUAL( leaves[4], iter.handle() ); expected.clear(); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B0154, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3210, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B4567, 1e-6 ) ); expected.push_back( 0 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3047, -1e-6 ) ); expected.push_back( 1 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3047, 1e-6 ) ); expected.clear(); expected.push_back( 7 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B2376, -1e-6 ) ); expected.insert( expected.begin(), 6 ); // See NOTE // expected.insert( expected.begin(), 1 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B2376, 1e-6 ) ); expected.clear(); expected.push_back( 5 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B1265, -1e-6 ) ); // See NOTE // expected.push_back( 6 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B1265, 1e-6 ) ); // check neighbors of leaf 5 CHECK_ERR( iter.step() ); CHECK_EQUAL( leaves[5], iter.handle() ); expected.clear(); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B0154, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B1265, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3210, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B4567, 1e-6 ) ); expected.push_back( 4 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3047, -1e-6 ) ); // See NOTE // expected.push_back( 7 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3047, 1e-6 ) ); expected.clear(); expected.push_back( 6 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B2376, -1e-6 ) ); expected.push_back( 7 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B2376, 1e-6 ) ); /* +---------+---------+--------------------+ | 2 | 1 | 7 | 6 | +---------+---------+----------+---------+ | 3 | 0 | 4 | 5 | +------------------------------+---------+ */ // check neighbors of leaf 6 CHECK_ERR( iter.step() ); CHECK_EQUAL( leaves[6], iter.handle() ); expected.clear(); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B2376, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B1265, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3210, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B4567, 1e-6 ) ); expected.push_back( 7 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3047, -1e-6 ) ); // See NOTE // expected.insert( expected.begin(), 4 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3047, 1e-6 ) ); expected.clear(); expected.push_back( 5 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B0154, -1e-6 ) ); expected.insert( expected.begin(), 4 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B0154, 1e-6 ) ); // check neighbors of leaf 7 CHECK_ERR( iter.step() ); CHECK_EQUAL( leaves[7], iter.handle() ); expected.clear(); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B2376, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3210, 1e-6 ) ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B4567, 1e-6 ) ); expected.push_back( 1 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3047, -1e-6 ) ); expected.insert( expected.begin(), 0 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B3047, 1e-6 ) ); expected.clear(); expected.push_back( 4 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B0154, -1e-6 ) ); // See NOTE // expected.insert( expected.begin(), 0 ); expected.push_back( 5 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B0154, 1e-6 ) ); expected.clear(); expected.push_back( 6 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B1265, -1e-6 ) ); // See NOTE // expected.insert( expected.begin(), 5 ); CHECK_EQUAL( expected, neighbors( iter, leaves, BSPTreeBoxIter::B1265, 1e-6 ) ); }
void test_box_iterator | ( | ) |
Definition at line 243 of file bsp_tree_test.cpp.
References aabox_corners(), moab::BSPTreeBoxIter::back(), CHECK, CHECK_EQUAL, CHECK_ERR, compare_hexes(), moab::BSPTree::create_tree(), moab::BSPTreeIter::depth(), ErrorCode, moab::BSPTreeBoxIter::get_box_corners(), moab::BSPTreeIter::get_parent_split_plane(), moab::BSPTree::get_tree_end_iterator(), moab::BSPTree::get_tree_iterator(), moab::BSPTreeIter::handle(), MB_ENTITY_NOT_FOUND, moab::BSPTree::Plane::norm, moab::BSPTree::split_leaf(), moab::BSPTreeBoxIter::step(), and moab::BSPTreeIter::tool().
Referenced by main().
{ Core moab; BSPTree tool( &moab ); ErrorCode rval; EntityHandle root; BSPTreeBoxIter iter; const double min[3] = { -1, -2, -3 }; const double max[3] = { 3, 2, 1 }; // create a depth-1 tree rval = tool.create_tree( min, max, root );CHECK_ERR( rval ); rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); // check initial state of iterator CHECK_EQUAL( &tool, iter.tool() ); CHECK_EQUAL( root, iter.handle() ); CHECK_EQUAL( 1u, iter.depth() ); // check initial corner values double corners[8][3], expt[8][3]; aabox_corners( min, max, expt ); rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); // should fail if at root BSPTree::Plane p; rval = iter.get_parent_split_plane( p ); CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval ); // check that step past end returns correct value rval = iter.step(); CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval ); // reset iterator rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); // check that step past start returns correct value rval = iter.back(); CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval ); // reset iterator rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); // insert a single split plane rval = tool.split_leaf( iter, BSPTree::Plane( 2, 0, 0, 0 ) );CHECK_ERR( rval ); // check initial location CHECK_EQUAL( 2u, iter.depth() ); CHECK( iter.handle() != root ); // create new iterators at left and right ends BSPTreeIter left, right; rval = tool.get_tree_iterator( root, left );CHECK_ERR( rval ); rval = tool.get_tree_end_iterator( root, right );CHECK_ERR( rval ); // compare post-split iterator to left CHECK_EQUAL( left.depth(), iter.depth() ); CHECK_EQUAL( left.handle(), iter.handle() ); // check box aabox_corners( min, max, expt ); for( int i = 0; i < 8; ++i ) if( expt[i][0] > 0 ) expt[i][0] = 0; rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); // step to other leaf rval = iter.step();CHECK_ERR( rval ); // check location CHECK_EQUAL( 2u, iter.depth() ); CHECK( iter.handle() != root ); // compare stepped iterator to right CHECK_EQUAL( right.depth(), iter.depth() ); CHECK_EQUAL( right.handle(), iter.handle() ); // check box aabox_corners( min, max, expt ); for( int i = 0; i < 8; ++i ) if( expt[i][0] < 0 ) expt[i][0] = 0; rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); // step to back to first leaf rval = iter.back();CHECK_ERR( rval ); // compare to left CHECK_EQUAL( left.depth(), iter.depth() ); CHECK_EQUAL( left.handle(), iter.handle() ); // check box aabox_corners( min, max, expt ); for( int i = 0; i < 8; ++i ) if( expt[i][0] > 0 ) expt[i][0] = 0; rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); // check plane // should have unit normal left.get_parent_split_plane( p ); CHECK_EQUAL( BSPTree::Plane( 1, 0, 0, 0 ), p ); p.norm[0] = 11; right.get_parent_split_plane( p ); CHECK_EQUAL( BSPTree::Plane( 1, 0, 0, 0 ), p ); // check step past ends rval = left.back(); CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval ); rval = right.step(); CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval ); }
void test_box_leaf_intersects_ray | ( | ) |
Definition at line 32 of file bsp_tree_test.cpp.
References test_leaf_intersects_ray_common().
Referenced by main().
{ test_leaf_intersects_ray_common( true ); }
void test_box_tree_create | ( | ) |
Definition at line 435 of file bsp_tree_test.cpp.
References aabox_corners(), CHECK, CHECK_EQUAL, CHECK_ERR, compare_hexes(), moab::BSPTree::create_tree(), moab::BSPTreeIter::depth(), ErrorCode, moab::BSPTreeBoxIter::get_box_corners(), moab::BSPTreeIter::get_parent_split_plane(), moab::BSPTree::get_tree_iterator(), moab::BSPTreeIter::handle(), MB_ENTITY_NOT_FOUND, moab::BSPTree::split_leaf(), moab::BSPTreeBoxIter::step(), and moab::BSPTreeIter::tool().
Referenced by main().
{ Core moab; BSPTree tool( &moab ); ErrorCode rval; EntityHandle root; BSPTreeBoxIter iter; BSPTree::Plane p; const double min[3] = { -2, -2, -2 }; const double max[3] = { 2, 2, 2 }; // create a depth-1 tree rval = tool.create_tree( min, max, root );CHECK_ERR( rval ); rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); // check initial state of iterator CHECK_EQUAL( &tool, iter.tool() ); CHECK_EQUAL( root, iter.handle() ); CHECK_EQUAL( 1u, iter.depth() ); // check initial corner values double corners[8][3], expt[8][3]; aabox_corners( min, max, expt ); rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); // Try splits that should fail because they // do not intersect the leaf at all rval = tool.split_leaf( iter, BSPTree::Plane( 0, 0, 1, 4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 0, 0, 1, -4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 0, 1, 0, 4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 0, 1, 0, -4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, 0, 0, 4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, 0, 0, -4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( -1, -1, -1, 7 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( -1, -1, -1, -7 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, -1, -1, 7 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, -1, -1, -7 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, 1, -1, 7 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, 1, -1, -7 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( -1, 1, -1, 7 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( -1, 1, -1, -7 ) ); CHECK_EQUAL( MB_FAILURE, rval ); // Try a split that should fail because the // resulting leaf would not be a hexahedron. // Clip each corner twice using planes with opposing normals rval = tool.split_leaf( iter, BSPTree::Plane( -1, -1, -1, -4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, 1, 1, 4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, -1, -1, -4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( -1, 1, 1, 4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, 1, -1, -4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( -1, -1, 1, 4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( -1, 1, -1, -4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, -1, 1, 4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( -1, -1, 1, -4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, 1, -1, 4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, -1, 1, -4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( -1, 1, -1, 4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, 1, 1, -4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( -1, -1, -1, 4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( -1, 1, 1, -4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, -1, -1, 4 ) ); CHECK_EQUAL( MB_FAILURE, rval ); // Clip each edge rval = tool.split_leaf( iter, BSPTree::Plane( -1, -1, 0, -2 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, -1, 0, -2 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, 1, 0, -2 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( -1, 1, 0, -2 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 0, -1, -1, -2 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 0, 1, -1, -2 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 0, 1, 1, -2 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 0, -1, 1, -2 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( -1, 0, -1, -2 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, 0, -1, -2 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( 1, 0, 1, -2 ) ); CHECK_EQUAL( MB_FAILURE, rval ); rval = tool.split_leaf( iter, BSPTree::Plane( -1, 0, 1, -2 ) ); CHECK_EQUAL( MB_FAILURE, rval ); // verify that iterator is still valid after many failed splits CHECK_EQUAL( &tool, iter.tool() ); CHECK_EQUAL( root, iter.handle() ); CHECK_EQUAL( 1u, iter.depth() ); rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); // split with z=0 rval = tool.split_leaf( iter, BSPTree::Plane( 0, 0, 0.5, 0 ) );CHECK_ERR( rval ); CHECK_EQUAL( 2u, iter.depth() ); // check that parent split plane is correct rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( 0, 0, 1, 0 ), p ); // check that box corners are correct aabox_corners( min, max, expt ); for( unsigned i = 0; i < 8; ++i ) if( expt[i][2] > 0.0 ) expt[i][2] = 0.0; rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); // split with z=-1 and normal in opposite direction rval = tool.split_leaf( iter, BSPTree::Plane( 0, 0, -2, -2 ) );CHECK_ERR( rval ); CHECK_EQUAL( 3u, iter.depth() ); for( unsigned i = 0; i < 8; ++i ) if( expt[i][2] < -1.0 ) expt[i][2] = -1.0; rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); // step to next leaf (z < -1) rval = iter.step();CHECK_ERR( rval ); CHECK_EQUAL( 3u, iter.depth() ); aabox_corners( min, max, expt ); for( unsigned i = 0; i < 8; ++i ) if( expt[i][2] > -1.0 ) expt[i][2] = -1.0; rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); // split at x = -1 rval = tool.split_leaf( iter, BSPTree::Plane( -0.1, 0, 0, -0.1 ) );CHECK_ERR( rval ); CHECK_EQUAL( 4u, iter.depth() ); // check that parent split plane is correct rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( -1, 0, 0, -1 ), p ); // check that leaf box is correct aabox_corners( -1, -2, -2, 2, 2, -1, expt ); rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); // split at x = 1 rval = tool.split_leaf( iter, BSPTree::Plane( 5, 0, 0, -5 ) );CHECK_ERR( rval ); CHECK_EQUAL( 5u, iter.depth() ); // check that parent split plane is correct rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( 1, 0, 0, -1 ), p ); // check that leaf box is correct aabox_corners( -1, -2, -2, 1, 2, -1, expt ); rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); // split at y = -1 rval = tool.split_leaf( iter, BSPTree::Plane( 0, -1, 0, -1 ) );CHECK_ERR( rval ); CHECK_EQUAL( 6u, iter.depth() ); // check that parent split plane is correct rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( 0, -1, 0, -1 ), p ); // check that leaf box is correct aabox_corners( -1, -1, -2, 1, 2, -1, expt ); rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); // split at y = 1 rval = tool.split_leaf( iter, BSPTree::Plane( 0, 1, 0, -1 ) );CHECK_ERR( rval ); CHECK_EQUAL( 7u, iter.depth() ); // check that parent split plane is correct rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( 0, 1, 0, -1 ), p ); // check that leaf box is correct aabox_corners( -1, -1, -2, 1, 1, -1, expt ); rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); // iterate over tree, verifying rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); CHECK_EQUAL( 3u, iter.depth() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( 0, 0, -1, -1 ), p ); aabox_corners( -2, -2, -1, 2, 2, 0, expt ); rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); rval = iter.step();CHECK_ERR( rval ); CHECK_EQUAL( 7u, iter.depth() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( 0, 1, 0, -1 ), p ); aabox_corners( -1, -1, -2, 1, 1, -1, expt ); rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); rval = iter.step();CHECK_ERR( rval ); CHECK_EQUAL( 7u, iter.depth() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( 0, 1, 0, -1 ), p ); aabox_corners( -1, 1, -2, 1, 2, -1, expt ); rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); rval = iter.step();CHECK_ERR( rval ); CHECK_EQUAL( 6u, iter.depth() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( 0, -1, 0, -1 ), p ); aabox_corners( -1, -2, -2, 1, -1, -1, expt ); rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); rval = iter.step();CHECK_ERR( rval ); CHECK_EQUAL( 5u, iter.depth() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( 1, 0, 0, -1 ), p ); aabox_corners( 1, -2, -2, 2, 2, -1, expt ); rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); rval = iter.step();CHECK_ERR( rval ); CHECK_EQUAL( 4u, iter.depth() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( -1, 0, 0, -1 ), p ); aabox_corners( -2, -2, -2, -1, 2, -1, expt ); rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); rval = iter.step();CHECK_ERR( rval ); CHECK_EQUAL( 2u, iter.depth() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( 0, 0, 1, 0 ), p ); aabox_corners( -2, -2, 0, 2, 2, 2, expt ); rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expt, corners, 1e-6 ) ); // no more leaves rval = iter.step(); CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval ); }
void test_gen_leaf_intersects_ray | ( | ) |
Definition at line 36 of file bsp_tree_test.cpp.
References test_leaf_intersects_ray_common().
Referenced by main().
{ test_leaf_intersects_ray_common( false ); }
void test_iterator | ( | ) |
Definition at line 96 of file bsp_tree_test.cpp.
References moab::BSPTreeIter::back(), CHECK, CHECK_EQUAL, CHECK_ERR, moab::BSPTree::create_tree(), moab::BSPTreeIter::depth(), ErrorCode, moab::BSPTreeIter::get_parent_split_plane(), moab::BSPTree::get_tree_end_iterator(), moab::BSPTree::get_tree_iterator(), moab::BSPTreeIter::handle(), MB_ENTITY_NOT_FOUND, moab::BSPTree::split_leaf(), moab::BSPTreeIter::step(), and moab::BSPTreeIter::tool().
{ Core moab; BSPTree tool( &moab ); ErrorCode rval; EntityHandle root; BSPTreeIter iter; // create a depth-1 tree rval = tool.create_tree( root );CHECK_ERR( rval ); rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); // check initial state of iterator CHECK_EQUAL( &tool, iter.tool() ); CHECK_EQUAL( root, iter.handle() ); CHECK_EQUAL( 1u, iter.depth() ); // should fail if at root BSPTree::Plane p; rval = iter.get_parent_split_plane( p ); CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval ); // check that step past end returns correct value rval = iter.step(); CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval ); // reset iterator rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); // check that step past start returns correct value rval = iter.back(); CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval ); // reset iterator rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); // insert a single split plane rval = tool.split_leaf( iter, BSPTree::Plane( 2, 0, 0, 0 ) );CHECK_ERR( rval ); // check initial location CHECK_EQUAL( 2u, iter.depth() ); CHECK( iter.handle() != root ); // create new iterators at left and right ends BSPTreeIter left, right; rval = tool.get_tree_iterator( root, left );CHECK_ERR( rval ); rval = tool.get_tree_end_iterator( root, right );CHECK_ERR( rval ); // compare post-split iterator to left CHECK_EQUAL( left.depth(), iter.depth() ); CHECK_EQUAL( left.handle(), iter.handle() ); // step to other leaf rval = iter.step();CHECK_ERR( rval ); // check location CHECK_EQUAL( 2u, iter.depth() ); CHECK( iter.handle() != root ); // compare stepped iterator to right CHECK_EQUAL( right.depth(), iter.depth() ); CHECK_EQUAL( right.handle(), iter.handle() ); // step to back to first leaf rval = iter.back();CHECK_ERR( rval ); // compare to left CHECK_EQUAL( left.depth(), iter.depth() ); CHECK_EQUAL( left.handle(), iter.handle() ); // check plane // should have unit normal left.get_parent_split_plane( p ); CHECK_EQUAL( BSPTree::Plane( 1, 0, 0, 0 ), p ); p.norm[0] = 11; right.get_parent_split_plane( p ); CHECK_EQUAL( BSPTree::Plane( 1, 0, 0, 0 ), p ); // check step past ends rval = left.back(); CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval ); rval = right.step(); CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval ); }
Definition at line 706 of file bsp_tree_test.cpp.
References aabox_corners(), CHECK, CHECK_EQUAL, CHECK_ERR, compare_hexes(), moab::BSPTree::create_tree(), ErrorCode, moab::BSPTreeBoxIter::get_box_corners(), moab::BSPTreeIter::get_parent_split_plane(), moab::BSPTree::get_tree_iterator(), moab::BSPTreeIter::handle(), moab::BSPTree::leaf_containing_point(), MB_ENTITY_NOT_FOUND, moab::BSPTree::split_leaf(), and moab::BSPTreeIter::step().
Referenced by main().
{ Core moab; BSPTree tool( &moab ); ErrorCode rval; EntityHandle root; BSPTreeIter iter; BSPTreeBoxIter b_iter; BSPTree::Plane p; EntityHandle h; double expected[8][3], corners[8][3]; /* Build Tree 1.0 +---------+--------------+ | A | | | | | 0.7 +---------+ C | | | | | | | | B | | | +--------------+ 0.3 | | D | | | | 0.0 +---------+--------------+ 0.0 0.4 1.0 */ const BSPTree::Plane X_split( 1.0, 0.0, 0.0, -0.4 ); const BSPTree::Plane AB_split( 0.0, -1.0, 0.0, 0.7 ); const BSPTree::Plane CD_split( 0.0, -1.0, 0.0, 0.3 ); const double min[3] = { 0, 0, 0 }; const double max[3] = { 1, 1, 1 }; rval = tool.create_tree( min, max, root );CHECK_ERR( rval ); rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); rval = tool.split_leaf( iter, X_split );CHECK_ERR( rval ); rval = tool.split_leaf( iter, AB_split );CHECK_ERR( rval ); const EntityHandle A = iter.handle(); rval = iter.step();CHECK_ERR( rval ); const EntityHandle B = iter.handle(); rval = iter.step();CHECK_ERR( rval ); rval = tool.split_leaf( iter, CD_split );CHECK_ERR( rval ); const EntityHandle C = iter.handle(); rval = iter.step();CHECK_ERR( rval ); const EntityHandle D = iter.handle(); // Test queries inside tree const double A_point[] = { 0.1, 0.8, 0.5 }; rval = tool.leaf_containing_point( root, A_point, h );CHECK_ERR( rval ); CHECK_EQUAL( A, h ); rval = tool.leaf_containing_point( root, A_point, iter );CHECK_ERR( rval ); CHECK_EQUAL( A, iter.handle() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( AB_split, p ); rval = tool.leaf_containing_point( root, A_point, b_iter );CHECK_ERR( rval ); CHECK_EQUAL( A, b_iter.handle() ); aabox_corners( 0.0, 0.7, 0.0, 0.4, 1.0, 1.0, expected ); rval = b_iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expected, corners, 1e-6 ) ); const double B_point[] = { 0.3, 0.1, 0.6 }; rval = tool.leaf_containing_point( root, B_point, h );CHECK_ERR( rval ); CHECK_EQUAL( B, h ); rval = tool.leaf_containing_point( root, B_point, iter );CHECK_ERR( rval ); CHECK_EQUAL( B, iter.handle() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( AB_split, p ); rval = tool.leaf_containing_point( root, B_point, b_iter );CHECK_ERR( rval ); CHECK_EQUAL( B, b_iter.handle() ); aabox_corners( 0.0, 0.0, 0.0, 0.4, 0.7, 1.0, expected ); rval = b_iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expected, corners, 1e-6 ) ); const double C_point[] = { 0.9, 0.9, 0.1 }; rval = tool.leaf_containing_point( root, C_point, h );CHECK_ERR( rval ); CHECK_EQUAL( C, h ); rval = tool.leaf_containing_point( root, C_point, iter );CHECK_ERR( rval ); CHECK_EQUAL( C, iter.handle() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( CD_split, p ); rval = tool.leaf_containing_point( root, C_point, b_iter );CHECK_ERR( rval ); CHECK_EQUAL( C, b_iter.handle() ); aabox_corners( 0.4, 0.3, 0.0, 1.0, 1.0, 1.0, expected ); rval = b_iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expected, corners, 1e-6 ) ); const double D_point[] = { 0.5, 0.2, 0.9 }; rval = tool.leaf_containing_point( root, D_point, h );CHECK_ERR( rval ); CHECK_EQUAL( D, h ); rval = tool.leaf_containing_point( root, D_point, iter );CHECK_ERR( rval ); CHECK_EQUAL( D, iter.handle() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( CD_split, p ); rval = tool.leaf_containing_point( root, D_point, b_iter );CHECK_ERR( rval ); CHECK_EQUAL( D, b_iter.handle() ); aabox_corners( 0.4, 0.0, 0.0, 1.0, 0.3, 1.0, expected ); rval = b_iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expected, corners, 1e-6 ) ); // Try a couple points outside of the tree const double above_pt[] = { 0.5, 0.5, 2.0 }; rval = tool.leaf_containing_point( root, above_pt, b_iter ); CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval ); const double left_pt[] = { -1.0, 0.5, 0.5 }; rval = tool.leaf_containing_point( root, left_pt, b_iter ); CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval ); }
Definition at line 822 of file bsp_tree_test.cpp.
References CHECK_EQUAL, CHECK_ERR, moab::BSPTree::create_tree(), ErrorCode, moab::BSPTreeIter::get_parent_split_plane(), moab::BSPTree::get_tree_iterator(), moab::BSPTreeIter::handle(), moab::BSPTree::leaf_containing_point(), moab::BSPTree::split_leaf(), and moab::BSPTreeIter::step().
Referenced by main().
{ Core moab; BSPTree tool( &moab ); ErrorCode rval; EntityHandle root; BSPTreeIter iter; BSPTree::Plane p; EntityHandle h; /* Build Tree \ | \ C o (0,4,0) \ | \ | \ | B \ | D \| ________o (0,0,0) \ \ A \ o (1,-2,0) \ */ const BSPTree::Plane X_split( 2.0, 1.0, 0.0, 0.0 ); const BSPTree::Plane AB_split( 0.0, 1.0, 0.0, 0.0 ); const BSPTree::Plane CD_split( 1.0, 0.0, 0.0, 0.0 ); rval = tool.create_tree( root );CHECK_ERR( rval ); rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); rval = tool.split_leaf( iter, X_split );CHECK_ERR( rval ); rval = tool.split_leaf( iter, AB_split );CHECK_ERR( rval ); const EntityHandle A = iter.handle(); rval = iter.step();CHECK_ERR( rval ); const EntityHandle B = iter.handle(); rval = iter.step();CHECK_ERR( rval ); rval = tool.split_leaf( iter, CD_split );CHECK_ERR( rval ); const EntityHandle C = iter.handle(); rval = iter.step();CHECK_ERR( rval ); const EntityHandle D = iter.handle(); // Test queries inside tree const double A_point[] = { -1000, -1000, -1000 }; rval = tool.leaf_containing_point( root, A_point, h );CHECK_ERR( rval ); CHECK_EQUAL( A, h ); rval = tool.leaf_containing_point( root, A_point, iter );CHECK_ERR( rval ); CHECK_EQUAL( A, iter.handle() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( AB_split, p ); const double B_point[] = { -3, 1, 100 }; rval = tool.leaf_containing_point( root, B_point, h );CHECK_ERR( rval ); CHECK_EQUAL( B, h ); rval = tool.leaf_containing_point( root, B_point, iter );CHECK_ERR( rval ); CHECK_EQUAL( B, iter.handle() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( AB_split, p ); const double C_point[] = { -10, 500, 0 }; rval = tool.leaf_containing_point( root, C_point, h );CHECK_ERR( rval ); CHECK_EQUAL( C, h ); rval = tool.leaf_containing_point( root, C_point, iter );CHECK_ERR( rval ); CHECK_EQUAL( C, iter.handle() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( CD_split, p ); const double D_point[] = { 10, 500, 0 }; rval = tool.leaf_containing_point( root, D_point, h );CHECK_ERR( rval ); CHECK_EQUAL( D, h ); rval = tool.leaf_containing_point( root, D_point, iter );CHECK_ERR( rval ); CHECK_EQUAL( D, iter.handle() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( CD_split, p ); }
void test_leaf_intersects_ray_common | ( | bool | box | ) |
Start with only root box for initial testing
Now split twice and test the bottom right corne
Definition at line 1523 of file bsp_tree_test.cpp.
References CHECK, CHECK_ERR, CHECK_RAY_XSECTS, moab::BSPTree::create_tree(), ErrorCode, moab::BSPTree::get_tree_iterator(), moab::BSPTreeIter::intersect_ray(), moab::BSPTree::split_leaf(), moab::BSPTreeIter::step(), moab::BSPTree::X, and moab::BSPTree::Y.
Referenced by test_box_leaf_intersects_ray(), and test_gen_leaf_intersects_ray().
{ ErrorCode rval; Core moab; BSPTree tool( &moab ); double t_in, t_out; /** Start with only root box for initial testing **/ /* (1,5,-3) (2,5,-3) o----o /: / \ / : / \ (1,5,-1)o----o \ | : \ \ | : Y \ \ | : ^ \ \ | : | \ \ | : +-->X \ \ (6,1,-3) | o./..........\.......o | . L \ / |. Z \ / o--------------------o (1,1,-1) (6,1,-1) */ EntityHandle root; const double corners[][3] = { { 1, 1, -3 }, { 6, 1, -3 }, { 2, 5, -3 }, { 1, 5, -3 }, { 1, 1, -1 }, { 6, 1, -1 }, { 2, 5, -1 }, { 1, 5, -1 } }; rval = tool.create_tree( corners, root );CHECK_ERR( rval ); BSPTreeIter gen_iter; BSPTreeBoxIter box_iter; BSPTreeIter& iter = box ? static_cast< BSPTreeIter& >( box_iter ) : gen_iter; rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); // start with point inside box const double pt1[] = { 3.5, 3, -2 }; const double dir1[] = { 0.1, 0.1, 0.1 }; CHECK_RAY_XSECTS( pt1, dir1, 0, 2.5 ); const double dir2[] = { 5, 5, 5 }; CHECK_RAY_XSECTS( pt1, dir2, 0, 0.05 ); const double pxdir[] = { 1, 0, 0 }; CHECK_RAY_XSECTS( pt1, pxdir, 0, 0.5 ); const double nxdir[] = { -1, 0, 0 }; CHECK_RAY_XSECTS( pt1, nxdir, 0, 2.5 ); const double pydir[] = { 0, 1, 0 }; CHECK_RAY_XSECTS( pt1, pydir, 0, 0.5 ); const double nydir[] = { 0, -1, 0 }; CHECK_RAY_XSECTS( pt1, nydir, 0, 2 ); const double pzdir[] = { 0, 0, 1 }; CHECK_RAY_XSECTS( pt1, pzdir, 0, 1 ); const double nzdir[] = { 0, 0, -1 }; CHECK_RAY_XSECTS( pt1, nzdir, 0, 1 ); // point below box const double pt2[] = { 3.5, 3, -4 }; CHECK( !iter.intersect_ray( pt2, dir1, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt2, dir2, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt2, pxdir, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt2, nxdir, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt2, pydir, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt2, nydir, t_in, t_out ) ); CHECK_RAY_XSECTS( pt2, pzdir, 1, 3 ); CHECK( !iter.intersect_ray( pt2, nzdir, t_in, t_out ) ); // point right of box const double pt3[] = { 7, 3, -2 }; CHECK( !iter.intersect_ray( pt3, dir1, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt3, dir2, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt3, pxdir, t_in, t_out ) ); CHECK_RAY_XSECTS( pt3, nxdir, 3, 6 ); CHECK( !iter.intersect_ray( pt3, pydir, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt3, nydir, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt3, pzdir, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt3, nzdir, t_in, t_out ) ); // a few more complex test cases const double dira[] = { -2, -2, 0 }; CHECK_RAY_XSECTS( pt3, dira, 0.75, 1.0 ); const double dirb[] = { -1, -2.1, 0 }; CHECK( !iter.intersect_ray( pt3, dirb, t_in, t_out ) ); /** Now split twice and test the bottom right corne **/ BSPTree::Plane Y3( BSPTree::Y, 3.0 ); rval = tool.split_leaf( iter, Y3 );CHECK_ERR( rval ); BSPTree::Plane X2( BSPTree::X, 2.0 ); rval = tool.split_leaf( iter, X2 );CHECK_ERR( rval ); rval = iter.step();CHECK_ERR( rval ); /* (2,3,-3) o--------o (4,3,-3) /: / \ / : / \ (2,3,-1)o--------o(4,3,-1)\ (6,1,-3) | o.......\.......o | . \ / |. \ / o---------------o (2,1,-1) (6,1,-1) */ // start with point inside box const double pt4[] = { 4, 2, -2 }; CHECK_RAY_XSECTS( pt4, dir1, 0, 5 ); CHECK_RAY_XSECTS( pt4, dir2, 0, 0.1 ); CHECK_RAY_XSECTS( pt4, pxdir, 0, 1 ); CHECK_RAY_XSECTS( pt4, nxdir, 0, 2 ); CHECK_RAY_XSECTS( pt4, pydir, 0, 1 ); CHECK_RAY_XSECTS( pt4, nydir, 0, 1 ); CHECK_RAY_XSECTS( pt4, pzdir, 0, 1 ); CHECK_RAY_XSECTS( pt4, nzdir, 0, 1 ); // point below box const double pt5[] = { 4, 2, -4 }; CHECK( !iter.intersect_ray( pt5, dir1, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt5, dir2, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt5, pxdir, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt5, nxdir, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt5, pydir, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt5, nydir, t_in, t_out ) ); CHECK_RAY_XSECTS( pt5, pzdir, 1, 3 ); CHECK( !iter.intersect_ray( pt5, nzdir, t_in, t_out ) ); // point right of box const double pt6[] = { 7, 2, -2 }; CHECK( !iter.intersect_ray( pt6, dir1, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt6, dir2, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt6, pxdir, t_in, t_out ) ); CHECK_RAY_XSECTS( pt6, nxdir, 2, 5 ); CHECK( !iter.intersect_ray( pt6, pydir, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt6, nydir, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt6, pzdir, t_in, t_out ) ); CHECK( !iter.intersect_ray( pt6, nzdir, t_in, t_out ) ); // a few more complex test cases const double dird[] = { -2, -2, 0 }; CHECK_RAY_XSECTS( pt6, dird, 0.5, 0.5 ); const double dire[] = { -3, -2, 0 }; CHECK_RAY_XSECTS( pt6, dire, 0.4, 0.5 ); const double dirf[] = { -2, -2.1, 0 }; CHECK( !iter.intersect_ray( pt6, dirf, t_in, t_out ) ); }
void test_leaf_polyhedron | ( | ) |
Definition at line 1824 of file bsp_tree_test.cpp.
References build_tree(), moab::BSPTreeIter::calculate_polyhedron(), CHECK, CHECK_ERR, ErrorCode, moab::Interface::get_coords(), moab::Interface::get_entities_by_handle(), moab::BSPTree::get_tree_iterator(), moab::BSPTreeIter::handle(), moab::BSPTreePoly::is_point_contained(), moab::BSPTreePoly::is_valid(), MB_SUCCESS, moab::BSPTree::moab(), moab::BSPTreeIter::step(), and moab::BSPTreePoly::volume().
Referenced by main().
{ // array of 20 points used to construct tree static const double points[] = { 7, 6, 3, 5, 3, 5, 9, 2, 6, 7, 2, 1, 3, 9, 0, 6, 0, 6, 1, 6, 2, 9, 7, 8, 2, 0, 2, 5, 7, 3, 2, 2, 9, 7, 9, 8, 1, 6, 3, 3, 9, 2, 4, 9, 1, 4, 8, 7, 3, 0, 5, 0, 1, 6, 2, 3, 6, 1, 6, 0 }; const int num_pts = sizeof( points ) / ( 3 * sizeof( double ) ); ErrorCode rval; Core moab; BSPTree tool( &moab ); EntityHandle root = build_tree( points, num_pts, tool ); BSPTreeIter iter; rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); std::vector< EntityHandle > pts; std::vector< CartVect > coords; for( ; rval == MB_SUCCESS; rval = iter.step() ) { BSPTreePoly poly; rval = iter.calculate_polyhedron( poly );CHECK_ERR( rval ); CHECK( poly.is_valid() ); CHECK( poly.volume() > 0.0 ); pts.clear(); rval = tool.moab()->get_entities_by_handle( iter.handle(), pts );CHECK_ERR( rval ); CHECK( !pts.empty() ); coords.resize( pts.size() ); rval = tool.moab()->get_coords( &pts[0], pts.size(), coords[0].array() );CHECK_ERR( rval ); for( size_t i = 0; i < pts.size(); ++i ) CHECK( poly.is_point_contained( coords[i] ) ); } }
void test_leaf_sibling | ( | ) |
void test_leaf_splits_intersects | ( | ) |
Definition at line 1441 of file bsp_tree_test.cpp.
References CHECK, CHECK_EQUAL, CHECK_ERR, moab::BSPTree::create_tree(), ErrorCode, moab::BSPTree::Plane::flip(), moab::BSPTree::get_tree_iterator(), moab::BSPTreeBoxIter::intersects(), moab::BSPTreeBoxIter::MISS, moab::BSPTreeBoxIter::NONHEX, moab::BSPTree::Plane::set(), moab::BSPTreeBoxIter::SPLIT, and moab::BSPTreeBoxIter::splits().
Referenced by main().
{ Core moab; BSPTree tool( &moab ); ErrorCode rval; EntityHandle root; BSPTreeBoxIter iter; BSPTree::Plane p; const double min[3] = { 0, 0, 0 }; const double max[3] = { 1, 2, 3 }; rval = tool.create_tree( min, max, root );CHECK_ERR( rval ); rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); p.set( 1, 0, 0, 1 ); // x == -1 CHECK_EQUAL( BSPTreeBoxIter::MISS, iter.splits( p ) ); CHECK( !iter.intersects( p ) ); p.flip(); CHECK_EQUAL( BSPTreeBoxIter::MISS, iter.splits( p ) ); CHECK( !iter.intersects( p ) ); p.set( 1, 0, 0, 0 ); // x == 0 CHECK_EQUAL( BSPTreeBoxIter::NONHEX, iter.splits( p ) ); p.flip(); CHECK_EQUAL( BSPTreeBoxIter::NONHEX, iter.splits( p ) ); p.set( 1, 0, 0, -0.5 ); // x == 0.5 CHECK_EQUAL( BSPTreeBoxIter::SPLIT, iter.splits( p ) ); CHECK( iter.intersects( p ) ); p.flip(); CHECK_EQUAL( BSPTreeBoxIter::SPLIT, iter.splits( p ) ); CHECK( iter.intersects( p ) ); p.set( 1, 0, 0, -1 ); // x == 1 CHECK_EQUAL( BSPTreeBoxIter::NONHEX, iter.splits( p ) ); p.flip(); CHECK_EQUAL( BSPTreeBoxIter::NONHEX, iter.splits( p ) ); p.set( 1, 0, 0, -2 ); // x == 2 CHECK_EQUAL( BSPTreeBoxIter::MISS, iter.splits( p ) ); CHECK( !iter.intersects( p ) ); p.flip(); CHECK_EQUAL( BSPTreeBoxIter::MISS, iter.splits( p ) ); CHECK( !iter.intersects( p ) ); double pt1[3] = { 0, 0, 1.5 }; double pt2[3] = { 1, 0, 1.5 }; double pt3[3] = { 0, 1, 3.0 }; p.set( pt1, pt2, pt3 ); CHECK_EQUAL( BSPTreeBoxIter::NONHEX, iter.splits( p ) ); CHECK( iter.intersects( p ) ); p.flip(); CHECK_EQUAL( BSPTreeBoxIter::NONHEX, iter.splits( p ) ); CHECK( iter.intersects( p ) ); double pt4[3] = { 0, 2, 2.8 }; p.set( pt1, pt2, pt4 ); CHECK_EQUAL( BSPTreeBoxIter::SPLIT, iter.splits( p ) ); CHECK( iter.intersects( p ) ); p.flip(); CHECK_EQUAL( BSPTreeBoxIter::SPLIT, iter.splits( p ) ); CHECK( iter.intersects( p ) ); double pta[3] = { 0.8, 0, 0 }; double ptb[3] = { 0, 0.2, 3 }; double ptc[3] = { 0.8, 2, 3 }; p.set( pta, ptb, ptc ); CHECK_EQUAL( BSPTreeBoxIter::NONHEX, iter.splits( p ) ); CHECK( iter.intersects( p ) ); p.flip(); CHECK_EQUAL( BSPTreeBoxIter::NONHEX, iter.splits( p ) ); CHECK( iter.intersects( p ) ); }
void test_leaf_volume | ( | bool | box | ) |
Definition at line 1389 of file bsp_tree_test.cpp.
References CHECK_ERR, CHECK_REAL_EQUAL, moab::BSPTree::create_tree(), ErrorCode, moab::BSPTree::get_tree_iterator(), moab::BSPTree::split_leaf(), moab::BSPTreeIter::step(), and moab::BSPTreeIter::volume().
{ Core moab; BSPTree tool( &moab ); ErrorCode rval; EntityHandle root; BSPTreeBoxIter b_iter; BSPTreeIter g_iter; BSPTreeIter& iter = box ? b_iter : g_iter; /* Build Tree 1.0 +---------+--------------+ | A | | | | | 0.7 +---------+ C | | | | | | | | B | | | +--------------+ 0.3 | | D | | | | 0.0 +---------+--------------+ 0.0 0.4 1.0 */ const BSPTree::Plane X_split( 1.0, 0.0, 0.0, -0.4 ); const BSPTree::Plane AB_split( 0.0, -1.0, 0.0, 0.7 ); const BSPTree::Plane CD_split( 0.0, -1.0, 0.0, 0.3 ); const double min[3] = { 0, 0, 0 }; const double max[3] = { 1, 1, 1 }; rval = tool.create_tree( min, max, root );CHECK_ERR( rval ); rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); rval = tool.split_leaf( iter, X_split );CHECK_ERR( rval ); rval = tool.split_leaf( iter, AB_split );CHECK_ERR( rval ); rval = iter.step();CHECK_ERR( rval ); rval = iter.step();CHECK_ERR( rval ); rval = tool.split_leaf( iter, CD_split );CHECK_ERR( rval ); // reset iterator rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); // check leaf volumes CHECK_REAL_EQUAL( 0.12, iter.volume(), 1e-12 ); // A CHECK_ERR( iter.step() ); CHECK_REAL_EQUAL( 0.28, iter.volume(), 1e-12 ); // B CHECK_ERR( iter.step() ); CHECK_REAL_EQUAL( 0.42, iter.volume(), 1e-12 ); // C CHECK_ERR( iter.step() ); CHECK_REAL_EQUAL( 0.18, iter.volume(), 1e-12 ); // D }
void test_leaf_volume_box | ( | ) |
Definition at line 22 of file bsp_tree_test.cpp.
References test_leaf_volume().
Referenced by main().
{ test_leaf_volume( true ); }
void test_leaf_volume_gen | ( | ) |
Definition at line 26 of file bsp_tree_test.cpp.
References test_leaf_volume().
Referenced by main().
{ test_leaf_volume( false ); }
void test_merge_leaf | ( | ) |
Definition at line 905 of file bsp_tree_test.cpp.
References aabox_corners(), CHECK, CHECK_EQUAL, CHECK_ERR, compare_hexes(), moab::BSPTree::create_tree(), moab::BSPTreeIter::depth(), ErrorCode, moab::BSPTreeBoxIter::get_box_corners(), moab::BSPTreeIter::get_parent_split_plane(), moab::BSPTree::get_tree_iterator(), moab::BSPTreeIter::handle(), MB_ENTITY_NOT_FOUND, moab::BSPTree::merge_leaf(), moab::BSPTree::split_leaf(), and moab::BSPTreeBoxIter::step().
Referenced by main().
{ Core moab; BSPTree tool( &moab ); ErrorCode rval; EntityHandle root; BSPTreeBoxIter iter; BSPTree::Plane p; double expected[8][3], corners[8][3]; /* Build Tree 1.0 +---------+--------------+ | A | | | | | 0.7 +---------+ C | | | | | | | | B | | | +--------------+ 0.3 | | D | | | | 0.0 +---------+--------------+ 0.0 0.4 1.0 */ const BSPTree::Plane X_split( 1.0, 0.0, 0.0, -0.4 ); const BSPTree::Plane AB_split( 0.0, -1.0, 0.0, 0.7 ); const BSPTree::Plane CD_split( 0.0, -1.0, 0.0, 0.3 ); const double min[3] = { 0, 0, 0 }; const double max[3] = { 1, 1, 1 }; rval = tool.create_tree( min, max, root );CHECK_ERR( rval ); rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); rval = tool.split_leaf( iter, X_split );CHECK_ERR( rval ); const EntityHandle AB = iter.handle(); rval = tool.split_leaf( iter, AB_split );CHECK_ERR( rval ); rval = iter.step();CHECK_ERR( rval ); rval = iter.step();CHECK_ERR( rval ); const EntityHandle CD = iter.handle(); rval = tool.split_leaf( iter, CD_split );CHECK_ERR( rval ); rval = iter.step();CHECK_ERR( rval ); rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); rval = tool.merge_leaf( iter );CHECK_ERR( rval ); CHECK_EQUAL( AB, iter.handle() ); CHECK_EQUAL( 2u, iter.depth() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( X_split, p ); aabox_corners( 0.0, 0.0, 0.0, 0.4, 1.0, 1.0, expected ); rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expected, corners, 1e-6 ) ); rval = iter.step();CHECK_ERR( rval ); rval = iter.step();CHECK_ERR( rval ); rval = tool.merge_leaf( iter );CHECK_ERR( rval ); CHECK_EQUAL( CD, iter.handle() ); CHECK_EQUAL( 2u, iter.depth() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( X_split, p ); aabox_corners( 0.4, 0.0, 0.0, 1.0, 1.0, 1.0, expected ); rval = iter.get_box_corners( corners );CHECK_ERR( rval ); CHECK( compare_hexes( expected, corners, 1e-6 ) ); rval = iter.step(); CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval ); }
void test_set_plane | ( | ) |
Definition at line 86 of file bsp_tree_test.cpp.
References CHECK_REAL_EQUAL, moab::BSPTree::Plane::distance(), and moab::BSPTree::Plane::set().
Referenced by main().
{ BSPTree::Plane p; const double points[3][3] = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } }; p.set( points[0], points[1], points[2] ); CHECK_REAL_EQUAL( 0.0, p.distance( points[0] ), 1e-10 ); CHECK_REAL_EQUAL( 0.0, p.distance( points[1] ), 1e-10 ); CHECK_REAL_EQUAL( 0.0, p.distance( points[2] ), 1e-10 ); }
void test_tree_create | ( | ) |
Definition at line 357 of file bsp_tree_test.cpp.
References CHECK_EQUAL, CHECK_ERR, moab::BSPTree::create_tree(), moab::BSPTreeIter::depth(), ErrorCode, moab::BSPTreeIter::get_parent_split_plane(), moab::BSPTree::get_tree_iterator(), moab::BSPTreeIter::handle(), MB_ENTITY_NOT_FOUND, moab::BSPTree::split_leaf(), moab::BSPTreeIter::step(), and moab::BSPTreeIter::tool().
Referenced by main().
{ Core moab; BSPTree tool( &moab ); ErrorCode rval; EntityHandle root; BSPTreeIter iter; BSPTree::Plane p; // create a depth-1 tree rval = tool.create_tree( root );CHECK_ERR( rval ); rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); // check initial state of iterator CHECK_EQUAL( &tool, iter.tool() ); CHECK_EQUAL( root, iter.handle() ); CHECK_EQUAL( 1u, iter.depth() ); // split with z=0 rval = tool.split_leaf( iter, BSPTree::Plane( 0, 0, 0.5, 0 ) );CHECK_ERR( rval ); CHECK_EQUAL( 2u, iter.depth() ); // check that parent split plane is correct rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( 0, 0, 1, 0 ), p ); // split lower leaf with diagonal plane rval = tool.split_leaf( iter, BSPTree::Plane( 1, 1, 0, 0 ) );CHECK_ERR( rval ); CHECK_EQUAL( 3u, iter.depth() ); const double r = 0.5 * sqrt( 2.0 ); // check that parent split plane is correct rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( r, r, 0, 0 ), p ); // step to upper leaf rval = iter.step();CHECK_ERR( rval ); // split upper leaf with diagonal plane rval = tool.split_leaf( iter, BSPTree::Plane( -1, 1, 0, 0 ) );CHECK_ERR( rval ); CHECK_EQUAL( 4u, iter.depth() ); // check that parent split plane is correct rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( -r, r, 0, 0 ), p ); // iterate over four leaves // first leaf rval = tool.get_tree_iterator( root, iter );CHECK_ERR( rval ); CHECK_EQUAL( 3u, iter.depth() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( r, r, 0, 0 ), p ); // second leaf rval = iter.step();CHECK_ERR( rval ); CHECK_EQUAL( 4u, iter.depth() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( -r, r, 0, 0 ), p ); // third leaf rval = iter.step();CHECK_ERR( rval ); CHECK_EQUAL( 4u, iter.depth() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( -r, r, 0, 0 ), p ); // fourth leaf rval = iter.step();CHECK_ERR( rval ); CHECK_EQUAL( 2u, iter.depth() ); rval = iter.get_parent_split_plane( p );CHECK_ERR( rval ); CHECK_EQUAL( BSPTree::Plane( 0, 0, 1, 0 ), p ); // no more leaves rval = iter.step(); CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval ); }