From 15720acee4bdc0420ac45b8f7ec19a7627621b6d Mon Sep 17 00:00:00 2001 From: abn Date: Thu, 29 Apr 2021 10:21:30 +0200 Subject: [PATCH] [Intersect2D] Keep flexibility on orientation of mesh2 + for Voronoi and Gauss points notably --- .../InterpKernelGeo2DQuadraticPolygon.cxx | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) 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++) { -- 2.39.2