From: abn Date: Thu, 29 Apr 2021 08:21:30 +0000 (+0200) Subject: [Intersect2D] Keep flexibility on orientation of mesh2 X-Git-Tag: V9_8_0a1~12^2~2 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=refs%2Fheads%2Fabn%2Fintersec_fix3;p=tools%2Fmedcoupling.git [Intersect2D] Keep flexibility on orientation of mesh2 + for Voronoi and Gauss points notably --- diff --git a/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DQuadraticPolygon.cxx b/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DQuadraticPolygon.cxx index 38dbea803..3bb977302 100644 --- a/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DQuadraticPolygon.cxx +++ b/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DQuadraticPolygon.cxx @@ -1310,7 +1310,7 @@ void QuadraticPolygon::ComputeResidual(const QuadraticPolygon& pol1, const std:: { itConstr++; continue; } bool smthHappened=false, doneEarly=false; - // Complete a partially reconstructed polygon with boundary edges by matching nodes: + // Complete a partially reconstructed polygon with boundary edges of pol2 by matching nodes: for(std::list::iterator it2=edgesInPol2OnBoundaryL.begin();it2!=edgesInPol2OnBoundaryL.end();) { if(curN==(*it2)->getEndNode()) // only end node should be considered if orientation is correct for input meshes @@ -1327,6 +1327,28 @@ void QuadraticPolygon::ComputeResidual(const QuadraticPolygon& pol1, const std:: if (curN == startN) // we might end here { doneEarly = true; break; } } + + // It might be the case that the lookup on start nodes made above failed because pol2 is wrongly oriented. + // Be somewhat flexible and keep on supporting this case here (useful for voronisation notably): + if(!smthHappened) + { + for(std::list::iterator it2=edgesInPol2OnBoundaryL.begin();it2!=edgesInPol2OnBoundaryL.end();) + { + if(curN==(*it2)->getStartNode()) + { + (*it2)->incrRef(); + (*itConstr)->pushBack(new ElementaryEdge(*it2,true)); + curN=(*it2)->getEndNode(); + smthHappened=true; + it2=edgesInPol2OnBoundaryL.erase(it2); + } + else + it2++; + if (curN == startN) // we might end here + { doneEarly = true; break; } + } + } + if (doneEarly) { itConstr++; continue; } @@ -1347,7 +1369,7 @@ void QuadraticPolygon::ComputeResidual(const QuadraticPolygon& pol1, const std:: itZip++; } } - else + else // Nothing happened. { for(std::list::const_iterator it5=(*itConstr)->_sub_edges.begin();it5!=(*itConstr)->_sub_edges.end();it5++) {