From 5ea9370443568d9dd6c42c970cbc24c1b6ae6c28 Mon Sep 17 00:00:00 2001 From: abn Date: Mon, 14 Jan 2019 15:29:26 +0100 Subject: [PATCH] Intersec bug fix: point not added properly inserted in splitting. --- .../Geometric2D/InterpKernelGeo2DEdge.cxx | 7 +++-- .../Geometric2D/InterpKernelGeo2DEdge.hxx | 1 + .../InterpKernelGeo2DElementaryEdge.cxx | 3 ++- .../InterpKernelGeo2DElementaryEdge.hxx | 1 + .../Geometric2D/InterpKernelGeo2DNode.cxx | 7 +++-- .../InterpKernelGeo2DQuadraticPolygon.cxx | 10 +++++-- .../MEDCouplingIntersectTest.py | 27 +++++++++++++++++++ 7 files changed, 47 insertions(+), 9 deletions(-) diff --git a/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DEdge.cxx b/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DEdge.cxx index e5b3c1efc..d2a31d0ce 100644 --- a/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DEdge.cxx +++ b/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DEdge.cxx @@ -1070,8 +1070,11 @@ void Edge::fillGlobalInfoAbs(bool direction, const std::map& mapThis, const std::map& mapOther, int offset1, int offset2, double fact, double baryX, double baryY, - std::vector& edgesOther, std::vector& addCoo, std::map& mapAddCoo) const + unsigned skipStartOrEnd, + std::vector& edgesOther, std::vector& addCoo, std::map& mapAddCoo) const { - _start->fillGlobalInfoAbs2(mapThis,mapOther,offset1,offset2,fact,baryX,baryY,addCoo,mapAddCoo,edgesOther); + if (skipStartOrEnd != 1) // see meaning in splitAbs() + _start->fillGlobalInfoAbs2(mapThis,mapOther,offset1,offset2,fact,baryX,baryY,addCoo,mapAddCoo,edgesOther); + if (skipStartOrEnd != 2) _end->fillGlobalInfoAbs2(mapThis,mapOther,offset1,offset2,fact,baryX,baryY,addCoo,mapAddCoo,edgesOther); } diff --git a/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DEdge.hxx b/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DEdge.hxx index 2ed413efe..65162a84a 100644 --- a/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DEdge.hxx +++ b/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DEdge.hxx @@ -285,6 +285,7 @@ namespace INTERP_KERNEL void fillGlobalInfoAbs(bool direction, const std::map& mapThis, const std::map& mapOther, int offset1, int offset2, double fact, double baryX, double baryY, std::vector& edgesThis, std::vector& addCoo, std::map mapAddCoo) const; void fillGlobalInfoAbs2(const std::map& mapThis, const std::map& mapOther, int offset1, int offset2, double fact, double baryX, double baryY, + unsigned skipStartOrEnd, std::vector& edgesOther, std::vector& addCoo, std::map& mapAddCoo) const; protected: diff --git a/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DElementaryEdge.cxx b/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DElementaryEdge.cxx index 3f99fcde6..43b2f1926 100644 --- a/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DElementaryEdge.cxx +++ b/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DElementaryEdge.cxx @@ -230,9 +230,10 @@ void ElementaryEdge::fillGlobalInfoAbs(const std::map * unsorted because the "other" mesh is not subdivided yet. */ void ElementaryEdge::fillGlobalInfoAbs2(const std::map& mapThis, const std::map& mapOther, int offset1, int offset2, double fact, double baryX, double baryY, + unsigned skipStartOrEnd, std::vector& edgesOther, std::vector& addCoo, std::map& mapAddCoo) const { - _ptr->fillGlobalInfoAbs2(mapThis,mapOther,offset1,offset2,fact,baryX,baryY,edgesOther,addCoo,mapAddCoo); + _ptr->fillGlobalInfoAbs2(mapThis,mapOther,offset1,offset2,fact,baryX,baryY,skipStartOrEnd,edgesOther,addCoo,mapAddCoo); } /*! diff --git a/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DElementaryEdge.hxx b/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DElementaryEdge.hxx index f585b9aa1..dfeea282e 100644 --- a/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DElementaryEdge.hxx +++ b/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DElementaryEdge.hxx @@ -73,6 +73,7 @@ namespace INTERP_KERNEL INTERPKERNEL_EXPORT void fillGlobalInfoAbs(const std::map& mapThis, const std::map& mapOther, int offset1, int offset2, double fact, double baryX, double baryY, std::vector& edgesThis, std::vector& addCoo, std::map mapAddCoo) const; INTERPKERNEL_EXPORT void fillGlobalInfoAbs2(const std::map& mapThis, const std::map& mapOther, int offset1, int offset2, double fact, double baryX, double baryY, + unsigned skipStartOrEnd, std::vector& edgesOther, std::vector& addCoo, std::map& mapAddCoo) const; INTERPKERNEL_EXPORT static ElementaryEdge *BuildEdgeFromStartEndDir(bool direction, INTERP_KERNEL::Node *start, INTERP_KERNEL::Node *end); private: diff --git a/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DNode.cxx b/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DNode.cxx index 76d4efeac..e8a71439e 100644 --- a/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DNode.cxx +++ b/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DNode.cxx @@ -185,8 +185,8 @@ void Node::fillGlobalInfoAbs2(const std::map& mapThis int tmp; std::size_t sz1=addCoo.size(); fillGlobalInfoAbs(mapThis,mapOther,offset1,offset2,fact,baryX,baryY,addCoo,mapAddCoo,&tmp); - if(sz1!=addCoo.size() - || (tmp >= offset2 + if(sz1!=addCoo.size() // newly created point + || (tmp >= offset2 // or previously created point merged with a neighbour && (pointsOther.size() == 0 || pointsOther.back() != tmp))) { pointsOther.push_back(tmp); @@ -195,6 +195,5 @@ void Node::fillGlobalInfoAbs2(const std::map& mapThis std::vector::const_iterator it=std::find(pointsOther.begin(),pointsOther.end(),tmp); if(it!=pointsOther.end()) return ; - if(tmp1) // only if a new point has been added (i.e. an actual intersection was done) { - for(std::list::const_iterator it=otherTmp._sub_edges.begin();it!=otherTmp._sub_edges.end();it++) - (*it)->fillGlobalInfoAbs2(mapThis,mapOther,offset1,offset2,/**/fact,xBaryBB,yBaryBB,/**/subDivOther[otherEdgeIds[i]],addCoo,mapAddCoo); + int jj = 0; + for(std::list::const_iterator it=otherTmp._sub_edges.begin();it!=otherTmp._sub_edges.end();it++, jj++) + { + unsigned skipStartOrEnd = jj == 0 ? 1 : (jj == _sub_edges.size()-1 ? 2 : -1); // 1 means START, 2 means END, -1 other + (*it)->fillGlobalInfoAbs2(mapThis,mapOther,offset1,offset2, + fact,xBaryBB,yBaryBB, skipStartOrEnd, + /*out*/ subDivOther[otherEdgeIds[i]],addCoo,mapAddCoo); + } } } Delete(cThis); diff --git a/src/MEDCoupling_Swig/MEDCouplingIntersectTest.py b/src/MEDCoupling_Swig/MEDCouplingIntersectTest.py index f19780274..c4fbe9247 100644 --- a/src/MEDCoupling_Swig/MEDCouplingIntersectTest.py +++ b/src/MEDCoupling_Swig/MEDCouplingIntersectTest.py @@ -579,6 +579,33 @@ class MEDCouplingIntersectTest(unittest.TestCase): self.assertEqual(res2Tool.getValues(), [0, 1, -1, -1]) pass + def testIntersect2DMeshesTmp10(self): + """ Fixing issues when one of the quadratic point of the tool mesh also serves as a regular point somewhere else. + WARNING : the tool mesh is not conform, but this was NOT the initial cause of the problem """ + eps = 1.0e-6 + back = MEDCouplingUMesh('layer_1', 2) + coo = DataArrayDouble([(0.000000000000000,0.000000000000000),(0.000000000000007,113.449999999999960),(113.449999999999960,0.000000000000000),(80.221264325613788,80.221264325613788),(0.000000000000003,56.724999999999980),(56.724999999999980,0.000000000000000)]) + back.setCoords(coo) + c = DataArrayInt([32, 0, 1, 2, 4, 3, 5]) + cI = DataArrayInt([0, 7]) + back.setConnectivity(c, cI) + + tool = MEDCouplingUMesh('layer_2', 2) + coo = DataArrayDouble([(35.499999704817512,0.000000000000011),(35.413523784223756,2.476354817916448),(35.478374361065050,1.238932132335084),(35.563158391762734,2.486818288978067),(35.649999999999999,0.000000000000000),(35.628282983230761,1.244167057444159),(35.488341087993248,2.481586553447257),(35.575000000000003,0.000000000000000),(35.154516440325750,4.940645084082323),(35.305526997492230,3.710760415787641),(35.154516440325743,-4.940645084082338),(34.960674956295250,-6.164510258681856),(35.413523784223763,-2.476354817916429),(35.305526997492230,-3.710760415787643),(35.563158391762734,-2.486818288978048),(35.488341087993248,-2.481586553447238),(35.478374361018354,-1.238932133672371),(35.628282983230761,-1.244167057444150)]) + tool.setCoords(coo) + c = DataArrayInt([32, 0, 1, 3, 4, 2, 6, 5, 7, # 32, 6, 7, 9, 10, 8, 12, 11, 13 + 32, 12, 0, 4, 14, 16, 7, 17, 15, # 32, 18, 6, 10, 20, 22, 13, 23, 21 + 32, 8, 1, 12, 10, 9, 0, 13, 11]) # 32, 14, 7, 18, 16, 15, 6, 19, 17 + cI = DataArrayInt([0, 9, 18, 27]) + tool.setConnectivity(c, cI) + result, res2Back, res2Tool = MEDCouplingUMesh.Intersect2DMeshes(back, tool, eps) + + self.assertEqual(result.getNodalConnectivity().getValues(), [32, 10, 6, 7, 9, 25, 26, 27, 28, 32, 6, 0, 24, 14, 7, 29, 30, 31, 32, 33, 32, 24, 1, 2, 10, 9, 7, 6, 7, 14, 34, 35, 36, 37, 38, 39, 40, 41, 42]) + self.assertEqual(result.getNodalConnectivityIndex().getValues(), [0, 9, 20, 39]) + self.assertEqual(res2Back.getValues(), [0, 0, 0]) + self.assertEqual(res2Tool.getValues(), [0, 2, -1]) + pass + def testSwig2Intersect2DMeshWith1DLine1(self): """A basic test with no colinearity between m1 and m2.""" i=MEDCouplingIMesh("mesh",2,[5,5],[0.,0.],[1.,1.]) -- 2.39.2