/* ============ idBox::GetProjectionSilhouetteVerts ============ */ int idBox::GetProjectionSilhouetteVerts( const idVec3 &projectionOrigin, idVec3 silVerts[6] ) const { float f; int i, planeBits, *index; idVec3 points[8], dir1, dir2; ToPoints( points ); dir1 = points[0] - projectionOrigin; dir2 = points[6] - projectionOrigin; f = dir1 * axis[0]; planeBits = FLOATSIGNBITNOTSET( f ); f = dir2 * axis[0]; planeBits |= FLOATSIGNBITSET( f ) << 1; f = dir1 * axis[1]; planeBits |= FLOATSIGNBITNOTSET( f ) << 2; f = dir2 * axis[1]; planeBits |= FLOATSIGNBITSET( f ) << 3; f = dir1 * axis[2]; planeBits |= FLOATSIGNBITNOTSET( f ) << 4; f = dir2 * axis[2]; planeBits |= FLOATSIGNBITSET( f ) << 5; index = boxPlaneBitsSilVerts[planeBits]; for ( i = 0; i < index[0]; i++ ) { silVerts[i] = points[index[i+1]]; } return index[0]; }
/* ============ idBox::GetParallelProjectionSilhouetteVerts ============ */ int idBox::GetParallelProjectionSilhouetteVerts( const idVec3 &projectionDir, idVec3 silVerts[6] ) const { float f; int i, planeBits, *index; idVec3 points[8]; ToPoints( points ); planeBits = 0; f = projectionDir * axis[0]; if ( FLOATNOTZERO( f ) ) { planeBits = 1 << FLOATSIGNBITSET( f ); } f = projectionDir * axis[1]; if ( FLOATNOTZERO( f ) ) { planeBits |= 4 << FLOATSIGNBITSET( f ); } f = projectionDir * axis[2]; if ( FLOATNOTZERO( f ) ) { planeBits |= 16 << FLOATSIGNBITSET( f ); } index = boxPlaneBitsSilVerts[planeBits]; for ( i = 0; i < index[0]; i++ ) { silVerts[i] = points[index[i+1]]; } return index[0]; }
bool use_case_5_driver(stk::ParallelMachine comm) { stk::diag::Timer timer("Transfer Use Case 5", use_case::TIMER_TRANSFER, use_case::timer()); stk::diag::Timer timer_point_to_point(" Point To Point", timer); use_case::timerSet().setEnabledTimerMask(use_case::TIMER_ALL); bool status = true; const double TOLERANCE = 0.000001; const double rand_max = RAND_MAX; enum { DIM = 3 }; enum { FROMNUMPOINTS = 100 }; enum { TONUMPOINTS = 100 }; typedef Intrepid::FieldContainer<double> MDArray; MDArray FromPoints (FROMNUMPOINTS,DIM), ToPoints ( TONUMPOINTS,DIM), FromValues (FROMNUMPOINTS, 2), ToValues ( TONUMPOINTS, 2); for (unsigned i=0 ; i<FROMNUMPOINTS; ++i) { double l=0, q=0; for (unsigned j=0 ; j<DIM; ++j) { FromPoints(i,j) = rand()/rand_max; l += FromPoints(i,j); q += j*FromPoints(i,j); } FromValues(i,0) = l; FromValues(i,1) = q; } for (unsigned i=0 ; i<TONUMPOINTS; ++i) { for (unsigned j=0 ; j<DIM; ++j) { ToPoints(i,j) = rand()/rand_max; } } const double initial_radius = .05; boost::shared_ptr<stk::transfer::MDMesh > transfer_domain_mesh (new stk::transfer::MDMesh(FromValues, FromPoints, initial_radius, comm)); boost::shared_ptr<stk::transfer::MDMesh > transfer_range_mesh (new stk::transfer::MDMesh( ToValues, ToPoints, initial_radius, comm)); stk::transfer::GeometricTransfer< class stk::transfer::LinearInterpolate< class stk::transfer::MDMesh, class stk::transfer::MDMesh > > transfer(transfer_domain_mesh, transfer_range_mesh, "STK Transfer test Use case 5"); { stk::diag::TimeBlock __timer_point_to_point(timer_point_to_point); try { transfer.initialize(); transfer.apply(); } catch (std::exception &e) { std::cout <<__FILE__<<":"<<__LINE__ <<" Caught an std::exception with what string:" <<e.what() <<" rethrowing....." <<std::endl; status = status && false; } catch (...) { std::cout <<__FILE__<<":"<<__LINE__ <<" Caught an exception, rethrowing..." <<std::endl; status = status && false; } } if (status) { bool success = true; for (unsigned i=0 ; i<TONUMPOINTS; ++i) { double check_l = 0; double check_q = 0; for (unsigned j=0 ; j<DIM; ++j) { check_l += ToPoints(i,j); check_q += j*ToPoints(i,j); } if (TOLERANCE < fabs(check_l-ToValues(i,0)) ) { std::cout <<__FILE__<<":"<<__LINE__ <<" ToValues:"<<ToValues(i,0) <<" check:"<<check_l <<" error:"<<fabs(check_l-ToValues(i,0)) <<std::endl; success = false; } if (TOLERANCE < fabs(check_q-ToValues(i,1)) ) { std::cout <<__FILE__<<":"<<__LINE__ <<" ToValues:"<<ToValues(i,1) <<" check:"<<check_q <<" error:"<<fabs(check_q-ToValues(i,1)) <<std::endl; success = false; } } status = status && success; } timer.stop(); const bool collective_result = use_case::print_status(comm, status); return collective_result; }