void border_node(Halfedge_iterator eitr, Point& ept, Point& vpt) { Point& ep1 = eitr->vertex()->point(); Point& ep2 = eitr->opposite()->vertex()->point(); ept = Point((ep1[0]+ep2[0])/2, (ep1[1]+ep2[1])/2, (ep1[2]+ep2[2])/2); Halfedge_around_vertex_circulator vcir = eitr->vertex_begin(); Point& vp1 = vcir->opposite()->vertex()->point(); Point& vp0 = vcir->vertex()->point(); Point& vp_1 = (--vcir)->opposite()->vertex()->point(); vpt = Point((vp_1[0] + 6*vp0[0] + vp1[0])/8, (vp_1[1] + 6*vp0[1] + vp1[1])/8, (vp_1[2] + 6*vp0[2] + vp1[2])/8 ); }
void MSDM2_Component::ProcessMSDM2_per_vertex( Vertex_iterator pVertex,double radius,std::vector<double> & TabDistance1,std::vector<double>& TabDistance2,std::vector<Point3d> &TabPoint1,std::vector<Point3d> &TabPoint2) { std::set<int> vertices ; std::stack<Vertex_iterator> S ; Point3d O = pVertex->point() ; S.push(pVertex) ; vertices.insert(pVertex->tag()) ; TabDistance1.push_back(pVertex->KmaxCurv); TabPoint1.push_back(pVertex->point()); TabDistance2.push_back(pVertex->curvmatch); TabPoint2.push_back(pVertex->match); int NbSommetInSphere=0; //double SommeDistance=0; // MT while(!S.empty()) { Vertex_iterator v = S.top() ; S.pop() ; Point3d P = v->point() ; Halfedge_around_vertex_circulator h = v->vertex_begin(); Halfedge_around_vertex_circulator pHalfedgeStart = h; CGAL_For_all(h,pHalfedgeStart) { Point3d p1 = h->vertex()->point(); Point3d p2 = h->opposite()->vertex()->point(); Point3d p1m = h->vertex()->match; Point3d p2m = h->opposite()->vertex()->match; Vector V = (p2-p1); Vector Vm = (p2m-p1m); if(v==pVertex || V * (P - O) > 0.0) { double len_old = std::sqrt(V*V); bool isect = sphere_clip_vector_MSDM2(O, radius, P, V) ; double len_edge = std::sqrt(V*V); NbSommetInSphere++; double WeightedCurv1,WeightedCurv2; Point3d WeightedP1,WeightedP2; bool IsAlreadyIntegrated=false; if(!isect) { Vertex_iterator w=h->opposite()->vertex(); if(vertices.find(w->tag()) == vertices.end()) { vertices.insert(w->tag()) ; S.push(w) ; } else IsAlreadyIntegrated=true; } if (IsAlreadyIntegrated==false) { if(len_old!=0) { if(isect) { WeightedCurv1=(1-len_edge/len_old)*h->vertex()->KmaxCurv+len_edge/len_old*h->opposite()->vertex()->KmaxCurv; WeightedP1=p1+V; WeightedCurv2=(1-len_edge/len_old)*h->vertex()->curvmatch+len_edge/len_old*h->opposite()->vertex()->curvmatch; WeightedP2=p1m+(len_edge/len_old)*Vm; } else { WeightedCurv1=h->opposite()->vertex()->KmaxCurv; WeightedCurv2=h->opposite()->vertex()->curvmatch; WeightedP1=p2; WeightedP2=p2m; } } else { WeightedCurv1=h->opposite()->vertex()->KmaxCurv; WeightedCurv2=h->opposite()->vertex()->curvmatch; WeightedP1=p2; WeightedP2=p2m; } TabDistance1.push_back(WeightedCurv1); TabPoint1.push_back(WeightedP1); TabDistance2.push_back(WeightedCurv2); TabPoint2.push_back(WeightedP2); } } } }