36 const unsigned* conn )
38 std::vector< EntityHandle > verts( num_vert );
39 for(
int i = 0; i < num_vert; ++i )
40 moab->create_vertex( coords + 3 * i, verts[i] );
43 for(
int i = 0; i < num_tri; ++i )
45 tri_verts[0] = verts[conn[3 * i]];
46 tri_verts[1] = verts[conn[3 * i + 1]];
47 tri_verts[2] = verts[conn[3 * i + 2]];
48 moab->create_element(
MBTRI, tri_verts, 3, tri );
56 const double coords[] = { -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1 };
58 const unsigned conn[] = { 0, 1, 5, 0, 5, 4, 2, 6, 7, 2, 7, 3, 1, 2, 6, 1, 6, 5,
59 0, 3, 4, 3, 7, 4, 0, 1, 3, 1, 2, 3, 4, 5, 6, 4, 6, 7 };
69 const double coords[] = {
70 -3, -3, -3, 3, -3, -3, 3, 3, -3, -3, 3, -3, -3, -3, 3, 3, -3, 3, 3, 3, 3, -3, 3, 3,
73 -1, -3, -3, 1, -3, -3, 3, -1, -3, 3, 1, -3, 1, 3, -3, -1, 3, -3, -3, 1, -3, -3, -1, -3,
75 -1, -3, 3, 1, -3, 3, 3, -1, 3, 3, 1, 3, 1, 3, 3, -1, 3, 3, -3, 1, 3, -3, -1, 3,
77 -3, -3, -1, -3, -3, 1, 3, -3, -1, 3, -3, 1, 3, 3, -1, 3, 3, 1, -3, 3, -1, -3, 3, 1,
80 -1, -3, -1, 1, -3, -1, 1, -3, 1, -1, -3, 1,
82 3, -1, -1, 3, 1, -1, 3, 1, 1, 3, -1, 1,
84 1, 3, -1, -1, 3, -1, -1, 3, 1, 1, 3, 1,
86 -3, 1, -1, -3, -1, -1, -3, -1, 1, -3, 1, 1,
88 -1, -1, -3, 1, -1, -3, 1, 1, -3, -1, 1, -3,
90 -1, -1, 3, 1, -1, 3, 1, 1, 3, -1, 1, 3 };
91 const unsigned conn[] = {
93 0, 8, 24, 8, 32, 24, 8, 33, 32, 8, 9, 33, 9, 1, 33, 1, 26, 33, 24, 35, 25, 24, 32, 35, 32, 33, 35, 33, 34, 35,
94 33, 27, 34, 33, 26, 27, 35, 4, 25, 35, 16, 4, 35, 17, 16, 35, 34, 17, 27, 17, 34, 27, 5, 17,
96 36, 26, 1, 36, 1, 10, 36, 10, 11, 36, 11, 37, 11, 28, 37, 11, 2, 28, 36, 27, 26, 36, 39, 27, 36, 38, 39, 36, 37,
97 38, 37, 28, 38, 28, 29, 38, 18, 5, 27, 18, 27, 39, 18, 39, 38, 18, 38, 19, 6, 19, 38, 6, 38, 29,
99 12, 28, 2, 12, 40, 28, 12, 41, 40, 12, 13, 41, 3, 41, 13, 3, 30, 41, 43, 29, 28, 43, 28, 40, 43, 40, 41, 43, 41,
100 42, 41, 31, 42, 41, 30, 31, 43, 6, 29, 43, 20, 6, 43, 21, 20, 43, 42, 21, 21, 42, 31, 21, 31, 7,
102 44, 30, 3, 44, 3, 14, 44, 14, 15, 44, 15, 45, 15, 24, 45, 15, 0, 24, 44, 31, 30, 44, 47, 31, 44, 46, 47, 44, 45,
103 46, 46, 45, 24, 46, 24, 25, 31, 22, 7, 31, 47, 22, 46, 22, 47, 46, 23, 22, 46, 4, 23, 46, 25, 4,
105 8, 15, 0, 8, 48, 15, 8, 49, 48, 8, 9, 49, 1, 49, 9, 1, 10, 49, 51, 14, 15, 51, 15, 48, 51, 48, 49, 51, 49, 50,
106 11, 50, 49, 11, 49, 10, 51, 3, 14, 51, 13, 3, 51, 12, 13, 51, 50, 12, 11, 12, 50, 11, 2, 12,
108 4, 52, 16, 4, 23, 52, 22, 52, 23, 22, 55, 52, 22, 21, 55, 22, 7, 21, 17, 16, 52, 17, 52, 53, 54, 53, 52, 54, 52,
109 55, 54, 55, 21, 54, 21, 20, 18, 5, 17, 18, 17, 53, 18, 53, 54, 18, 54, 19, 6, 19, 54, 6, 54, 20 };
117 const double coords[] = { 1, 0, 0, 0, 1, 0, -1, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1 };
118 const unsigned conn[] = { 0, 1, 4, 1, 2, 4, 2, 3, 4, 3, 0, 4, 1, 0, 5, 2, 1, 5, 3, 2, 5, 0, 3, 5 };
138 all_tris.
merge( tris );
141 const CartVect cen( 0.5 * ( min + max ) ), hdim( 0.5 * ( max - min ) );
149 CHECK( conn_len == 3 );
157 CHECK( expected_tris == all_tris );
163 for(
unsigned i = 0; i < num_tri; ++i )
170 rval =
moab->get_connectivity( tris[0], conn, conn_len );
186 for(
unsigned j = 1; j < num_tri; ++j )
188 rval =
moab->get_connectivity( tris[j], conn, conn_len );
201 for(
unsigned i = 0; i < num_tris; ++i )
205 rval =
moab->get_connectivity( tris[i], conn, conn_len );
212 CHECK( fabs( tript[0] ) < 1e-6 );
213 CHECK( fabs( tript[1] ) < 1e-6 );
214 CHECK( fabs( tript[2] ) < 1e-6 );
244 double min[3] = { -5, -4, -1 };
245 double max[3] = { 5, 4, 1 };
275 if( leaves ) leaves[1] = iter.
handle();
281 if( leaves ) leaves[2] = iter.
handle();
294 if( leaves ) leaves[3] = iter.
handle();
300 if( leaves ) leaves[4] = iter.
handle();
320 if( leaves ) leaves[5] = iter.
handle();
326 if( leaves ) leaves[6] = iter.
handle();
339 if( leaves ) leaves[7] = iter.
handle();
345 if( leaves ) leaves[8] = iter.
handle();
361 double min[3] = { -3, -2, -1 };
362 double max[3] = { 1, 2, 3 };
387 std::vector< AdaptiveKDTreeIter > list;
399 CHECK( list.empty() );
404 CHECK( list.size() == 1 );
407 CHECK( list.front().handle() == leaves[3] );
412 CHECK( list.empty() );
417 CHECK( list.size() == 1 );
420 CHECK( list.front().handle() == leaves[2] );
425 CHECK( list.empty() );
430 CHECK( list.empty() );
442 CHECK( list.empty() );
447 CHECK( list.size() == 1 );
450 CHECK( list.front().handle() == leaves[3] );
456 CHECK( list.size() == 1 );
458 CHECK( list.front().handle() == leaves[1] );
463 CHECK( list.size() == 2 );
465 if( list[0].handle() == leaves[6] )
std::swap( list[0], list[1] );
466 CHECK( list[0].handle() == leaves[5] );
467 CHECK( list[1].handle() == leaves[6] );
474 CHECK( list.empty() );
479 CHECK( list.empty() );
558 std::ostringstream options;
559 options <<
"MAX_PER_LEAF=1;SPLITS_PER_DIR=1;PLANE_SET=0;";
567 rval = tool.
build_tree( box_tris, &root, &opts );
575 rval = tool.
build_tree( box_tris, &root, &opts );
583 rval = tool.
build_tree( box_tris, &root, &opts );
588 options <<
"MAX_DEPTH=2;";
591 rval = tool.
build_tree( box_tris, &root, &opts );
603 std::ostringstream options;
604 options <<
"MAX_PER_LEAF=1;SPLITS_PER_DIR=1;PLANE_SET=0;";
613 rval = tool.
build_tree( box_tris, &root, &opts );
618 for(
unsigned i = 0; i < 8; ++i )
620 int x = i & 1 ? 1 : -1;
621 int y = i & 2 ? 1 : -1;
622 int z = i & 4 ? 1 : -1;
623 double coords[] = { 2.0 * x, 2.0 * y, 2.0 * z };
628 CHECK( fabs( x - point[0] ) < 1e-6 );
629 CHECK( fabs( y - point[1] ) < 1e-6 );
630 CHECK( fabs( z - point[2] ) < 1e-6 );
638 for(
unsigned i = 0; i < 6; ++i )
644 const CartVect diff = facepts[i] - point;
645 CHECK( fabs( diff[0] ) < 1e-6 );
646 CHECK( fabs( diff[1] ) < 1e-6 );
647 CHECK( fabs( diff[2] ) < 1e-6 );
654 const double far[] = { 0.75, 0.75, 200 };
658 CHECK( fabs( point[0] - 0.75 ) < 1e-6 );
659 CHECK( fabs( point[1] - 0.75 ) < 1e-6 );
660 CHECK( fabs( point[2] - 1.00 ) < 1e-6 );
671 rval = tool.
build_tree( box_tris, &root, &opts );
676 for(
unsigned i = 0; i < 8; ++i )
678 int x = i & 1 ? 1 : -1;
679 int y = i & 2 ? 1 : -1;
680 int z = i & 4 ? 1 : -1;
681 double coords[] = { 4.0 * x, 4.0 * y, 4.0 * z };
686 CHECK( fabs( 3.0 * x - point[0] ) < 1e-6 );
687 CHECK( fabs( 3.0 * y - point[1] ) < 1e-6 );
688 CHECK( fabs( 3.0 * z - point[2] ) < 1e-6 );
696 for(
unsigned i = 0; i < 6; ++i )
702 const CartVect diff = facepts2[i] - point;
703 CHECK( fabs( diff[0] ) < 1e-6 );
704 CHECK( fabs( diff[1] ) < 1e-6 );
705 CHECK( fabs( diff[2] ) < 1e-6 );
712 const double far[] = { 2.75, 2.75, 200 };
716 CHECK( fabs( point[0] - 2.75 ) < 1e-6 );
717 CHECK( fabs( point[1] - 2.75 ) < 1e-6 );
718 CHECK( fabs( point[2] - 3.00 ) < 1e-6 );
730 std::ostringstream options;
731 options <<
"MAX_PER_LEAF=1;SPLITS_PER_DIR=1;PLANE_SET=0;";
735 std::vector< EntityHandle > triangles;
740 rval = tool.
build_tree( box_tris, &root, &opts );
745 for(
unsigned i = 0; i < 8; ++i )
747 double x = i & 1 ? 1 : -1;
748 double y = i & 2 ? 1 : -1;
749 double z = i & 4 ? 1 : -1;
750 double center[] = { x, y, z };
755 CHECK( triangles.size() >= 3 );
756 CHECK( triangles.size() <= 6 );
768 rval = tool.
build_tree( box_tris, &root, &opts );
773 for(
unsigned i = 0; i < 8; ++i )
775 int x = i & 1 ? 1 : -1;
776 int y = i & 2 ? 1 : -1;
777 int z = i & 4 ? 1 : -1;
778 double center[] = { 3.0 * x, 3.0 * y, 3.0 * z };
783 CHECK( triangles.size() >= 3 );
784 CHECK( triangles.size() <= 6 );
796 std::ostringstream options;
797 options <<
"MAX_PER_LEAF=1;SPLITS_PER_DIR=1;PLANE_SET=0;";
801 std::vector< EntityHandle > tris;
802 std::vector< double > dists;
807 rval = tool.
build_tree( box_tris, &root, &opts );
818 CHECK( tris.size() == 3 );
819 CHECK( dists.size() == tris.size() );
820 for(
unsigned i = 0; i < dists.size(); ++i )
822 CHECK( fabs( dists[i] - 1 ) < 1e-6 || fabs( dists[i] - 3 ) < 1e-6 );
823 CartVect tript = pt + dists[i] * dir;
832 CHECK( tris.size() == 1 );
833 CHECK( dists.size() == tris.size() );
834 CHECK( fabs( dists[0] - 1 ) < 1e-6 );
842 CHECK( tris.size() == 1 );
843 CHECK( dists.size() == tris.size() );
844 CHECK( fabs( dists[0] - 1 ) < 1e-6 );
853 CHECK( tris.size() == 2 );
854 CHECK( dists.size() == tris.size() );
855 for(
unsigned i = 0; i < dists.size(); ++i )
857 CHECK( fabs( dists[i] - 1 ) < 1e-6 );
858 CartVect tript = pt + dists[i] * dir;
863 dir =
CartVect( 0.5 * sqrt( 2.0 ), 0.5 * sqrt( 2.0 ), 0.0 );
869 CHECK( tris.size() == 2 );
870 CHECK( dists.size() == tris.size() );
871 if( dists[0] < dists[1] )
873 CHECK( fabs( dists[0] - 0.5 * sqrt( 2.0 ) ) < 1e-6 );
874 CHECK( fabs( dists[1] - sqrt( 2.0 ) ) < 1e-6 );
886 CHECK( tris.size() == 4 );
887 CHECK( dists.size() == tris.size() );
888 for(
unsigned i = 0; i < dists.size(); ++i )
890 CHECK( fabs( dists[i] - 1 ) < 1e-6 || fabs( dists[i] - 3 ) < 1e-6 );
891 CartVect tript = pt + dists[i] * dir;
902 CHECK( tris.size() == 4 );
903 CHECK( dists.size() == tris.size() );
904 for(
unsigned i = 0; i < dists.size(); ++i )
906 CHECK( fabs( dists[i] - 1 ) < 1e-6 || fabs( dists[i] - 3 ) < 1e-6 );
907 CartVect tript = pt + dists[i] * dir;
916 CHECK( tris.size() == 2 );
917 CHECK( dists.size() == tris.size() );
918 for(
unsigned i = 0; i < dists.size(); ++i )
920 CHECK( fabs( dists[i] - 1 ) < 1e-6 );
921 CartVect tript = pt + dists[i] * dir;
1013 const double min[3] = { -5, -4, -1 };
1014 const double max[3] = { 1, 2, 3 };
1060 #define CHECK_RAY_XSECTS( PT, DIR, T_IN, T_OUT ) \
1063 CHECK( iter.intersect_ray( ( PT ), ( DIR ), t_in, t_out ) ); \
1064 CHECK_REAL_EQUAL( ( T_IN ), t_in, 1e-6 ); \
1065 CHECK_REAL_EQUAL( ( T_OUT ), t_out, 1e-6 ); \
1076 const double min[3] = { -5, -4, -1 };
1077 const double max[3] = { 1, 2, 3 };
1084 const double pt1[] = { 0, 0, 0 };
1085 const double dir1[] = { 0.1, 0.1, 0.1 };
1087 const double dir2[] = { 5, 5, 5 };
1089 const double pxdir[] = { 1, 0, 0 };
1091 const double nxdir[] = { -1, 0, 0 };
1093 const double pydir[] = { 0, 1, 0 };
1095 const double nydir[] = { 0, -1, 0 };
1097 const double pzdir[] = { 0, 0, 1 };
1099 const double nzdir[] = { 0, 0, -1 };
1103 const double pt2[] = { 0, 0, -2 };
1114 const double pt3[] = { 3, 0, 0 };
1125 const double dira[] = { -3, 0, 3 };
1127 const double dirb[] = { -2, 0, 3.1 };
1133 #ifdef MOAB_HAVE_MPI
1134 int fail = MPI_Init( 0, 0 );
1151 #ifdef MOAB_HAVE_MPI
1152 fail = MPI_Finalize();