diff --git a/Geo/discreteFace.cpp b/Geo/discreteFace.cpp index a6e6196cec2121155e31dd3df7d3930546906b7e..776a0a8dddece283f6d778ef2c2ce85afcc97d56 100644 --- a/Geo/discreteFace.cpp +++ b/Geo/discreteFace.cpp @@ -153,12 +153,12 @@ void discreteFace::createGeometry() updateTopology(toParam); for(unsigned int i=0; i<toParam.size(); i++){ - printf("MAP(%d) : aspect ratio = %12.5E\n",i,toParam[i]->aspectRatio()); + //printf("MAP(%d) : aspect ratio = %12.5E\n",i,toParam[i]->aspectRatio()); char name[256]; - sprintf(name,"map%d.pos",i); + //sprintf(name,"map%d.pos",i); toParam[i]->print(name,i); fillHoles(toParam[i]); - sprintf(name,"mapFilled%d.pos",i); + //sprintf(name,"mapFilled%d.pos",i); toParam[i]->print(name,i); } for(unsigned int i=0; i<toParam.size(); i++){ @@ -695,32 +695,54 @@ void discreteFace::fillHoles(triangulation* trian) std::map<double,std::vector<MVertex*> >::reverse_iterator it = bords.rbegin(); ++it; for(; it!=bords.rend(); ++it){ - double x[3] = {0.,0.,0.}; + SPoint3 x(0.,0.,0.); std::vector<MVertex*> mv = it->second; for(unsigned int j=0; j<mv.size(); j++){ - x[0] += mv[j]->x(); - x[1] += mv[j]->y(); - x[2] += mv[j]->z(); + SPoint3 v0, v1; + if(j==0){ + SPoint3 v(mv[mv.size()-1]->x(),mv[mv.size()-1]->y(),mv[mv.size()-1]->z()); + v0 = v; + SPoint3 v_(mv[j+1]->x(),mv[j+1]->y(),mv[j+1]->z()); + v1 = v_; + } + else if (j==mv.size()-1){ + SPoint3 v(mv[j-1]->x(),mv[j-1]->y(),mv[j-1]->z()); + v0 = v; + SPoint3 v_(mv[0]->x(),mv[0]->y(),mv[0]->z()); + v1 = v_; + } + else{ + SPoint3 v(mv[j-1]->x(),mv[j-1]->y(),mv[j-1]->z()); + v0 = v; + SPoint3 v_(mv[j+1]->x(),mv[j+1]->y(),mv[j+1]->z()); + v1 = v_; + } + SPoint3 vpp(mv[j]->x(),mv[j]->y(),mv[j]->z()); + SVector3 v00(vpp,v0); + SVector3 v11(v1,vpp); + x += vpp*(norm(v00)+norm(v11)); } - x[0] /= mv.size(); x[1] /= mv.size(); x[2] /= mv.size(); - MVertex* center = new MVertex(x[0],x[1],x[2]); + x *= .5/it->first; + MVertex* center = new MVertex(x.x(),x.y(),x.z()); this->mesh_vertices.push_back(center); - center->setEntity(this); trian->vert.insert(center); + SVector3 nmean(0.,0.,0.); for(unsigned int j=1; j<mv.size(); j++){ - if(std::abs(tri3Darea(mv[j],mv[j-1],center))<1e-15){ - MVertex temp(center->x()+mv[j]->x()/mv.size(),center->y()+mv[j-1]->y()/mv.size(),(1+1./mv.size())*center->z()); - *center = temp; - center->setEntity(this); - } addTriangle(trian,new MTriangle(mv[j],mv[j-1],center)); - } - if(std::abs(tri3Darea(mv[0],mv[mv.size()-1],center))<1e-15){ - MVertex temp(center->x()+mv[0]->x()/mv.size(),center->y()+mv[mv.size()-1]->y()/mv.size(),(1+1./mv.size())*center->z()); - *center = temp; - center->setEntity(this); + SVector3 temp0(center->x()-mv[j]->x(),center->y()-mv[j]->y(),center->z()-mv[j]->z()); + SVector3 temp1(center->x()-mv[j-1]->x(),center->y()-mv[j-1]->y(),center->z()-mv[j-1]->z()); + SVector3 temp(crossprod(temp0,temp1)); + nmean += temp; } addTriangle(trian,new MTriangle(mv[0],mv[mv.size()-1],center)); + SVector3 temp0(center->x()-mv[0]->x(),center->y()-mv[0]->y(),center->z()-mv[0]->z()); + SVector3 temp1(center->x()-mv[mv.size()-1]->x(),center->y()-mv[mv.size()-1]->y(),center->z()-mv[mv.size()-1]->z()); + SVector3 temp(crossprod(temp0,temp1)); + nmean += temp; + nmean *= 1./(norm(nmean)*mv.size()); + MVertex update(center->x()+nmean.x(),center->y()+nmean.y(),center->z()+nmean.z()); + *center = update; + center->setEntity(this); } #endif }