48 #if MB_ORIENTED_BOX_UNIT_VECTORS
52 #if MB_ORIENTED_BOX_UNIT_VECTORS
56 #if MB_ORIENTED_BOX_UNIT_VECTORS
77 #if MB_ORIENTED_BOX_UNIT_VECTORS
78 double t = ( m % ( p - b ) );
80 double t = ( m % ( p - b ) ) / ( m % m );
88 CartVect len( ax1_len, ax2_len, ax3_len );
94 std::swap( len[0], len[2] );
98 else if( len[1] < len[0] )
100 std::swap( len[0], len[1] );
103 if( len[1] > len[2] )
105 std::swap( len[1], len[2] );
109 #if MB_ORIENTED_BOX_UNIT_VECTORS
116 #if MB_ORIENTED_BOX_OUTER_RADIUS
124 axes =
Matrix3( axes_in[0], axes_in[1], axes_in[2],
false );
138 #if MB_ORIENTED_BOX_OUTER_RADIUS
139 const int rad_size = 1;
141 const int rad_size = 0;
143 #if MB_ORIENTED_BOX_UNIT_VECTORS
144 const int SIZE = rad_size + 15;
146 const int SIZE = rad_size + 12;
148 assert(
sizeof(
OrientedBox ) == SIZE *
sizeof(
double ) );
169 CartVect min( std::numeric_limits< double >::max() ), max( -std::numeric_limits< double >::max() );
175 for(
int d = 0; d < 3; ++d )
178 if( t < min[d] ) min[d] = t;
179 if( t > max[d] ) max[d] = t;
189 const CartVect mid = 0.5 * ( min + max );
193 CartVect range = 0.5 * ( max - min );
194 if( range[2] < range[1] )
196 if( range[2] < range[0] )
198 std::swap( range[0], range[2] );
202 else if( range[1] < range[0] )
204 std::swap( range[0], range[1] );
207 if( range[1] > range[2] )
209 std::swap( range[1], range[2] );
214 #if MB_ORIENTED_BOX_UNIT_VECTORS
222 #if MB_ORIENTED_BOX_OUTER_RADIUS
285 for(
int j = 2; j < conn_len; ++j )
287 EntityHandle vertices[3] = { conn[0], conn[j - 1], conn[j] };
289 rval = instance->
get_coords( vertices, 3, coords[0].array() );
293 const CartVect edge0 = coords[1] - coords[0];
294 const CartVect edge1 = coords[2] - coords[0];
295 const CartVect centroid = ( coords[0] + coords[1] + coords[2] ) / 3;
296 const double tri_area2 = ( edge0 * edge1 ).
length();
297 result.
area += tri_area2;
298 result.
center += tri_area2 * centroid;
328 const Range& vertices )
330 if( data.
area <= 0.0 )
356 #if MB_ORIENTED_BOX_UNIT_VECTORS
357 return fabs( from_center %
axes.
col( 0 ) ) -
length[0] <= tol &&
361 for(
int i = 0; i < 3; ++i )
373 unsigned data_length,
374 const Range& vertices )
378 for(
const CovarienceData*
const end = data + data_length; data != end; ++data )
443 const double normal_par_dir,
444 const double half_extent,
445 const double* nonneg_ray_len,
446 const double* neg_ray_len )
449 const double extent_pos_diff = half_extent - normal_par_pos;
454 assert( 0 <= *nonneg_ray_len );
455 if( normal_par_dir > 0 )
457 if( *nonneg_ray_len * normal_par_dir >= extent_pos_diff && extent_pos_diff >= 0 )
return true;
459 else if( normal_par_dir < 0 )
461 if( *nonneg_ray_len * normal_par_dir <= extent_pos_diff && extent_pos_diff <= 0 )
return true;
466 if( normal_par_dir > 0 )
468 if( extent_pos_diff >= 0 )
return true;
470 else if( normal_par_dir < 0 )
472 if( extent_pos_diff <= 0 )
return true;
479 assert( 0 >= *neg_ray_len );
480 if( normal_par_dir > 0 )
482 if( *neg_ray_len * normal_par_dir <= extent_pos_diff && extent_pos_diff < 0 )
return true;
484 else if( normal_par_dir < 0 )
486 if( *neg_ray_len * normal_par_dir >= extent_pos_diff && extent_pos_diff > 0 )
return true;
499 const double* nonneg_ray_len,
500 const double* neg_ray_len )
const
504 const double dist_s = cx % ray_direction;
505 const double dist_sq = cx % cx - ( dist_s * dist_s );
512 if( dist_sq > max_diagsq )
return false;
519 assert( 0 <= *nonneg_ray_len );
523 assert( 0 >= *neg_ray_len );
524 max_len = std::max( *nonneg_ray_len, -( *neg_ray_len ) );
528 max_len = *nonneg_ray_len;
530 const double temp = fabs( dist_s ) - max_len;
531 if( 0.0 < temp && temp * temp > max_diagsq )
return false;
542 if( *nonneg_ray_len > dist_s )
return true;
552 if( neg_ray_len && *neg_ray_len < dist_s )
return true;
561 CartVect par_dir = B * ray_direction;
566 const double half_x =
length[0] + reps;
567 const double half_y =
length[1] + reps;
568 const double half_z =
length[2] + reps;
571 if( ( par_pos[0] > half_x && par_dir[0] >= 0 ) || ( par_pos[0] < -half_x && par_dir[0] <= 0 ) )
return false;
573 if( ( par_pos[1] > half_y && par_dir[1] >= 0 ) || ( par_pos[1] < -half_y && par_dir[1] <= 0 ) )
return false;
575 if( ( par_pos[2] > half_z && par_dir[2] >= 0 ) || ( par_pos[2] < -half_z && par_dir[2] <= 0 ) )
return false;
579 if( par_pos[0] <= half_x && par_pos[0] >= -half_x && par_pos[1] <= half_y && par_pos[1] >= -half_y &&
580 par_pos[2] <= half_z && par_pos[2] >= -half_z )
584 if( fabs( par_dir[0] * ( half_z - par_pos[2] ) + par_dir[2] * par_pos[0] ) <=
585 fabs( par_dir[2] * half_x ) &&
586 fabs( par_dir[1] * ( half_z - par_pos[2] ) + par_dir[2] * par_pos[1] ) <=
587 fabs( par_dir[2] * half_y ) &&
588 check_ray_limits( par_pos[2], par_dir[2], half_z, nonneg_ray_len, neg_ray_len ) )
590 if( fabs( par_dir[0] * ( -half_z - par_pos[2] ) + par_dir[2] * par_pos[0] ) <= fabs( par_dir[2] * half_x ) &&
591 fabs( par_dir[1] * ( -half_z - par_pos[2] ) + par_dir[2] * par_pos[1] ) <= fabs( par_dir[2] * half_y ) &&
592 check_ray_limits( par_pos[2], par_dir[2], -half_z, nonneg_ray_len, neg_ray_len ) )
596 if( fabs( par_dir[0] * ( half_y - par_pos[1] ) + par_dir[1] * par_pos[0] ) <= fabs( par_dir[1] * half_x ) &&
597 fabs( par_dir[2] * ( half_y - par_pos[1] ) + par_dir[1] * par_pos[2] ) <= fabs( par_dir[1] * half_z ) &&
598 check_ray_limits( par_pos[1], par_dir[1], half_y, nonneg_ray_len, neg_ray_len ) )
600 if( fabs( par_dir[0] * ( -half_y - par_pos[1] ) + par_dir[1] * par_pos[0] ) <= fabs( par_dir[1] * half_x ) &&
601 fabs( par_dir[2] * ( -half_y - par_pos[1] ) + par_dir[1] * par_pos[2] ) <= fabs( par_dir[1] * half_z ) &&
602 check_ray_limits( par_pos[1], par_dir[1], -half_y, nonneg_ray_len, neg_ray_len ) )
606 if( fabs( par_dir[1] * ( half_x - par_pos[0] ) + par_dir[0] * par_pos[1] ) <= fabs( par_dir[0] * half_y ) &&
607 fabs( par_dir[2] * ( half_x - par_pos[0] ) + par_dir[0] * par_pos[2] ) <= fabs( par_dir[0] * half_z ) &&
608 check_ray_limits( par_pos[0], par_dir[0], half_x, nonneg_ray_len, neg_ray_len ) )
610 if( fabs( par_dir[1] * ( -half_x - par_pos[0] ) + par_dir[0] * par_pos[1] ) <= fabs( par_dir[0] * half_y ) &&
611 fabs( par_dir[2] * ( -half_x - par_pos[0] ) + par_dir[0] * par_pos[2] ) <= fabs( par_dir[0] * half_z ) &&
612 check_ray_limits( par_pos[0], par_dir[0], -half_x, nonneg_ray_len, neg_ray_len ) )
621 int signs[8][3] = { { -1, -1, -1 }, { 1, -1, -1 }, { 1, 1, -1 }, { -1, 1, -1 },
622 { -1, -1, 1 }, { 1, -1, 1 }, { 1, 1, 1 }, { -1, 1, 1 } };
624 std::vector< EntityHandle > vertices;
625 for(
int i = 0; i < 8; ++i )
628 for(
int j = 0; j < 3; ++j )
630 #if MB_ORIENTED_BOX_UNIT_VECTORS
633 coords += signs[i][j] *
axes.
col( j );
643 vertices.push_back( handle );
661 #if MB_ORIENTED_BOX_UNIT_VECTORS
664 for(
int i = 0; i < 3; ++i )
666 if( local[i] < -
length[i] )
668 else if( local[i] >
length[i] )
676 for(
int i = 0; i < 3; ++i )
678 if( local[i] < -1.0 )
680 else if( local[i] > 1.0 )