diff --git a/Geo/MVertex.cpp b/Geo/MVertex.cpp index 4238a82429160b41af6181a525e792f70bc84cb8..7e824c649cb522108c6f0226ecb24fabb177b754 100644 --- a/Geo/MVertex.cpp +++ b/Geo/MVertex.cpp @@ -379,7 +379,7 @@ static void getAllParameters(MVertex *v, GFace *gf, std::vector<SPoint2> ¶ms params.push_back((*it)->reparamOnFace(gf, range.low(),-1)); params.push_back((*it)->reparamOnFace(gf, range.low(), 1)); } - else if (gv == (*it)->getEndVertex()){ + if (gv == (*it)->getEndVertex()){ params.push_back((*it)->reparamOnFace(gf, range.high(),-1)); params.push_back((*it)->reparamOnFace(gf, range.high(), 1)); } @@ -419,45 +419,53 @@ bool reparamMeshEdgeOnFace(MVertex *v1, MVertex *v2, GFace *gf, if (p1.size() == 1 && p2.size() == 1){ param1 = p1[0]; param2 = p2[0]; - return true; - } - else if (p1.size() == 1 && p2.size() == 2){ - double d1 = - (p1[0].x() - p2[0].x()) * (p1[0].x() - p2[0].x()) + - (p1[0].y() - p2[0].y()) * (p1[0].y() - p2[0].y()); - double d2 = - (p1[0].x() - p2[1].x()) * (p1[0].x() - p2[1].x()) + - (p1[0].y() - p2[1].y()) * (p1[0].y() - p2[1].y()); - param1 = p1[0]; - param2 = d2 < d1 ? p2[1] : p2[0]; - return true; - } - else if (p2.size() == 1 && p1.size() == 2){ - double d1 = - (p2[0].x() - p1[0].x()) * (p2[0].x() - p1[0].x()) + - (p2[0].y() - p1[0].y()) * (p2[0].y() - p1[0].y()); - double d2 = - (p2[0].x() - p1[1].x()) * (p2[0].x() - p1[1].x()) + - (p2[0].y() - p1[1].y()) * (p2[0].y() - p1[1].y()); - param1 = d2 < d1 ? p1[1] : p1[0]; - param2 = p2[0]; - return true; - } - else if(p1.size() > 1 && p2.size() > 1){ - param1 = p1[0]; - param2 = p2[0]; - - printf("NO WAY : TWO VERTICES ON THE SEAM, CANNOT CHOOSE\n"); - - // shout, both vertices are on seams - return false; } - else{ - // brute force! - param1 = gf->parFromPoint(SPoint3(v1->x(), v1->y(), v1->z())); - param2 = gf->parFromPoint(SPoint3(v2->x(), v2->y(), v2->z())); - return true; + else{ + int imin = 0; + int jmin = 0; + { + double d = + (p2[0].x() - p1[0].x()) * (p2[0].x() - p1[0].x()) + + (p2[0].y() - p1[0].y()) * (p2[0].y() - p1[0].y()); + for (unsigned int i=0;i<p2.size();i++){ + double d1 = + (p2[i].x() - p1[0].x()) * (p2[i].x() - p1[0].x()) + + (p2[i].y() - p1[0].y()) * (p2[i].y() - p1[0].y()); + if (d1 < d){ + imin = i; + d = d1; + } + } + } + { + double d = + (p2[0].x() - p1[0].x()) * (p2[0].x() - p1[0].x()) + + (p2[0].y() - p1[0].y()) * (p2[0].y() - p1[0].y()); + for (unsigned int i=0;i<p1.size();i++){ + double d1 = + (p2[0].x() - p1[i].x()) * (p2[0].x() - p1[i].x()) + + (p2[0].y() - p1[i].y()) * (p2[0].y() - p1[i].y()); + if (d1 < d){ + jmin = i; + d = d1; + } + } + } + /* + if (p1.size() == 8 ||p2.size() == 8){ + for (int i=0;i<p1.size();i++){ + printf("p1[%d] = %g %g\n",i,p1[i].x(),p1[i].y()); + } + for (int i=0;i<p2.size();i++){ + printf("p2[%d] = %g %g\n",i,p2[i].x(),p2[i].y()); + } + printf("%d %d\n",imin,jmin); + } + */ + param1 = p1[jmin]; + param2 = p2[imin]; } + return true; }