//********************************************************************************** //test of polyhedron intersection callable from python shell bool do_Polyhedras_Intersect(const shared_ptr<Shape>& cm1,const shared_ptr<Shape>& cm2,const State& state1,const State& state2){ const Se3r& se31=state1.se3; const Se3r& se32=state2.se3; Polyhedra* A = static_cast<Polyhedra*>(cm1.get()); Polyhedra* B = static_cast<Polyhedra*>(cm2.get()); //move and rotate 1st the CGAL structure Polyhedron Matrix3r rot_mat = (se31.orientation).toRotationMatrix(); Vector3r trans_vec = se31.position; Transformation t_rot_trans(rot_mat(0,0),rot_mat(0,1),rot_mat(0,2), trans_vec[0],rot_mat(1,0),rot_mat(1,1),rot_mat(1,2),trans_vec[1],rot_mat(2,0),rot_mat(2,1),rot_mat(2,2),trans_vec[2],1.); Polyhedron PA = A->GetPolyhedron(); std::transform( PA.points_begin(), PA.points_end(), PA.points_begin(), t_rot_trans); //move and rotate 2st the CGAL structure Polyhedron rot_mat = (se32.orientation).toRotationMatrix(); trans_vec = se32.position; t_rot_trans = Transformation(rot_mat(0,0),rot_mat(0,1),rot_mat(0,2), trans_vec[0],rot_mat(1,0),rot_mat(1,1),rot_mat(1,2),trans_vec[1],rot_mat(2,0),rot_mat(2,1),rot_mat(2,2),trans_vec[2],1.); Polyhedron PB = B->GetPolyhedron(); std::transform( PB.points_begin(), PB.points_end(), PB.points_begin(), t_rot_trans); //calculate plane equations std::transform( PA.facets_begin(), PA.facets_end(), PA.planes_begin(),Plane_equation()); std::transform( PB.facets_begin(), PB.facets_end(), PB.planes_begin(),Plane_equation()); //call test return do_intersect(PA,PB); }
bool enemy_in_the_way(float rotation) { if(!enemy) return false; Ray ray(Point(ball->x, ball->y), Vector(sin(rotation), cos(rotation))); for(int i = 0; i < 4; ++i) { if(do_intersect(enemy_sides[i], ray)) return true; } return false; }
void remove_intersecting(SetUint group, vector<SetUint> &groups) { vector<SetUint >::iterator it = groups.begin(); while (it != groups.end()) { if (do_intersect(group, *it)) it = groups.erase(it); else ++it; } }
void operator()(const Box* bp, const Box* bq) { Face_descriptor fp = bp->f(); Triangle_3 tp = triangle(P, fp); Face_descriptor fq = bq->f(); Triangle_3 tq = triangle(Q, fq); if(do_intersect( tp, tq)) { ++(count); } }
//********************************************************************************** //generate "packing" of non-overlapping balls vector<Vector3r> fillBoxByBalls_cpp(Vector3r minCoord, Vector3r maxCoord, Vector3r sizemin, Vector3r sizemax, Vector3r ratio, int seed, shared_ptr<Material> mat, int NumPoints){ vector<Vector3r> v; Polyhedra trialP; Polyhedron trial, trial_moved; srand(seed); int it = 0; vector<Polyhedron> polyhedrons; vector<vector<Vector3r> > vv; Vector3r position; bool intersection; int count = 0; Vector3r radii; bool fixed_ratio = 0; if (ratio[0] > 0 && ratio[1] > 0 && ratio[2]>0){ fixed_ratio = 1; sizemax[0] = min(min(sizemax[0]/ratio[0], sizemax[1]/ratio[1]), sizemax[2]/ratio[2]); sizemin[0] = max(max(sizemin[0]/ratio[0], sizemin[1]/ratio[1]), sizemin[2]/ratio[2]); } fixed_ratio = 1; //force spherical //it - number of trials to make packing possibly more/less dense Vector3r random_size; while (it<1000){ it = it+1; if (it == 1){ if (fixed_ratio) { double rrr = (rand()*(sizemax[0]-sizemin[0])/RAND_MAX + sizemin[0])/2.; radii = Vector3r(rrr,rrr,rrr); }else { radii = Vector3r(rand()*(sizemax[0]-sizemin[0])/2.,rand()*(sizemax[1]-sizemin[1])/2.,rand()*(sizemax[2]-sizemin[2])/2.)/RAND_MAX + sizemin/2.; } trialP.v = BallPoints(radii,NumPoints,rand()); trialP.Initialize(); trial = trialP.GetPolyhedron(); Matrix3r rot_mat = (trialP.GetOri()).toRotationMatrix(); Transformation t_rot(rot_mat(0,0),rot_mat(0,1),rot_mat(0,2),rot_mat(1,0),rot_mat(1,1),rot_mat(1,2),rot_mat(2,0),rot_mat(2,1),rot_mat(2,2),1.); std::transform( trial.points_begin(), trial.points_end(), trial.points_begin(), t_rot); } position = Vector3r(rand()*(maxCoord[0]-minCoord[0]),rand()*(maxCoord[1]-minCoord[1]),rand()*(maxCoord[2]-minCoord[2]))/RAND_MAX + minCoord; //move CGAL structure Polyhedron Transformation transl(CGAL::TRANSLATION, ToCGALVector(position)); trial_moved = trial; std::transform( trial_moved.points_begin(), trial_moved.points_end(), trial_moved.points_begin(), transl); //calculate plane equations std::transform( trial_moved.facets_begin(), trial_moved.facets_end(), trial_moved.planes_begin(),Plane_equation()); intersection = false; //call test with boundary for(Polyhedron::Vertex_iterator vi = trial_moved.vertices_begin(); (vi != trial_moved.vertices_end()) && (!intersection); vi++){ intersection = (vi->point().x()<minCoord[0]) || (vi->point().x()>maxCoord[0]) || (vi->point().y()<minCoord[1]) || (vi->point().y()>maxCoord[1]) || (vi->point().z()<minCoord[2]) || (vi->point().z()>maxCoord[2]); } //call test with other polyhedrons for(vector<Polyhedron>::iterator a = polyhedrons.begin(); (a != polyhedrons.end()) && (!intersection); a++){ intersection = do_intersect(*a,trial_moved); if (intersection) break; } if (!intersection){ polyhedrons.push_back(trial_moved); v.clear(); for(Polyhedron::Vertex_iterator vi = trial_moved.vertices_begin(); vi != trial_moved.vertices_end(); vi++){ v.push_back(FromCGALPoint(vi->point())); } vv.push_back(v); it = 0; count ++; } } cout << "generated " << count << " polyhedrons"<< endl; //can't be used - no information about material Scene* scene=Omega::instance().getScene().get(); for(vector<vector<Vector3r> >::iterator p=vv.begin(); p!=vv.end(); ++p){ shared_ptr<Body> BP = NewPolyhedra(*p, mat); BP->shape->color = Vector3r(double(rand())/RAND_MAX,double(rand())/RAND_MAX,double(rand())/RAND_MAX); scene->bodies->insert(BP); } return v; }
// test whether a point lies on a segment bool on(Segment s, Point p) { //check whether the point lies on the segment return do_intersect(s, p); }
// test whether two segments intersect bool intersection1a(Segment s1, Segment s2){ //check for intersection of to segments return do_intersect(s1, s2); }