From 83cd0a3d5b4d69ad0d090904bb74fc9b6471178a Mon Sep 17 00:00:00 2001 From: abn Date: Mon, 14 Jan 2019 13:07:45 +0100 Subject: [PATCH] Intersect bug fix : quad point was not inserted in the map even when used as an extremity for another seg. --- .../InterpKernelGeo2DQuadraticPolygon.hxx | 3 +++ .../MEDCouplingUMesh_intersection.cxx | 23 +++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DQuadraticPolygon.hxx b/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DQuadraticPolygon.hxx index ee286fd39..dd786fc37 100644 --- a/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DQuadraticPolygon.hxx +++ b/src/INTERP_KERNEL/Geometric2D/InterpKernelGeo2DQuadraticPolygon.hxx @@ -35,6 +35,9 @@ namespace INTERP_KERNEL class Edge; class MergePoints; + enum NodeUsage { USAGE_UNKNOWN, USAGE_LINEAR, USAGE_QUADRATIC_ONLY }; + typedef std::pair NodeWithUsage; + /** * A set of quadratic or linear edges, not necessarily connected to form a closed polygon. * Some methods however requires a closed form. diff --git a/src/MEDCoupling/MEDCouplingUMesh_intersection.cxx b/src/MEDCoupling/MEDCouplingUMesh_intersection.cxx index f61742e0b..8a8b46dce 100644 --- a/src/MEDCoupling/MEDCouplingUMesh_intersection.cxx +++ b/src/MEDCoupling/MEDCouplingUMesh_intersection.cxx @@ -198,9 +198,13 @@ namespace MEDCoupling return ret; } - INTERP_KERNEL::Edge *MEDCouplingUMeshBuildQPFromEdge(INTERP_KERNEL::NormalizedCellType typ, std::map >& mapp2, const int *bg) + INTERP_KERNEL::Edge *MEDCouplingUMeshBuildQPFromEdge(INTERP_KERNEL::NormalizedCellType typ, std::map& mapp2, const int *bg) { INTERP_KERNEL::Edge *ret=0; + + mapp2[bg[0]].second = INTERP_KERNEL::USAGE_LINEAR; + mapp2[bg[1]].second = INTERP_KERNEL::USAGE_LINEAR; + switch(typ) { case INTERP_KERNEL::NORM_SEG2: @@ -220,7 +224,8 @@ namespace MEDCoupling ret=new INTERP_KERNEL::EdgeLin(mapp2[bg[0]].first,mapp2[bg[1]].first); else ret=new INTERP_KERNEL::EdgeArcCircle(mapp2[bg[0]].first,mapp2[bg[2]].first,mapp2[bg[1]].first); - mapp2[bg[2]].second=false; + if (mapp2[bg[2]].second != INTERP_KERNEL::USAGE_LINEAR) // switch the node usage to quadratic only if it is not used as an extreme point for another edge + mapp2[bg[2]].second = INTERP_KERNEL::USAGE_QUADRATIC_ONLY; break; } default: @@ -239,7 +244,7 @@ namespace MEDCoupling std::map& mapp) { mapp.clear(); - std::map > mapp2;//bool is for a flag specifying if node is boundary (true) or only a middle for SEG3. + std::map mapp2; // the last var is a flag specifying if node is an extreme node of the seg (LINEAR) or only a middle for SEG3 (QUADRATIC_ONLY). const double *coo=mDesc->getCoords()->getConstPointer(); const int *c=mDesc->getNodalConnectivity()->getConstPointer(); const int *cI=mDesc->getNodalConnectivityIndex()->getConstPointer(); @@ -249,7 +254,7 @@ namespace MEDCoupling for(std::set::const_iterator it2=s.begin();it2!=s.end();it2++) { INTERP_KERNEL::Node *n=new INTERP_KERNEL::Node(coo[2*(*it2)],coo[2*(*it2)+1]); - mapp2[*it2]=std::pair(n,true); + mapp2[*it2]=INTERP_KERNEL::NodeWithUsage(n,INTERP_KERNEL::USAGE_UNKNOWN); } INTERP_KERNEL::QuadraticPolygon *ret=new INTERP_KERNEL::QuadraticPolygon; for(std::vector::const_iterator it=candidates.begin();it!=candidates.end();it++) @@ -257,9 +262,9 @@ namespace MEDCoupling INTERP_KERNEL::NormalizedCellType typ=(INTERP_KERNEL::NormalizedCellType)c[cI[*it]]; ret->pushBack(MEDCouplingUMeshBuildQPFromEdge(typ,mapp2,c+cI[*it]+1)); } - for(std::map >::const_iterator it2=mapp2.begin();it2!=mapp2.end();it2++) + for(std::map::const_iterator it2=mapp2.begin();it2!=mapp2.end();it2++) { - if((*it2).second.second) + if((*it2).second.second == INTERP_KERNEL::USAGE_LINEAR) mapp[(*it2).second.first]=(*it2).first; ((*it2).second.first)->decrRef(); } @@ -466,17 +471,17 @@ void MEDCouplingUMesh::BuildIntersectEdges(const MEDCouplingUMesh *m1, const MED { const std::vector& divs=subDiv[i]; int nnode=cI[1]-cI[0]-1; - std::map > mapp2; + std::map mapp2; std::map mapp22; for(int j=0;j(nn,true); + mapp2[nnid]=INTERP_KERNEL::NodeWithUsage(nn,INTERP_KERNEL::USAGE_UNKNOWN); mapp22[nn]=nnid+offset1; } INTERP_KERNEL::Edge *e=MEDCouplingUMeshBuildQPFromEdge((INTERP_KERNEL::NormalizedCellType)c[*cI],mapp2,c+(*cI)+1); - for(std::map >::const_iterator it=mapp2.begin();it!=mapp2.end();it++) + for(std::map::const_iterator it=mapp2.begin();it!=mapp2.end();it++) ((*it).second.first)->decrRef(); std::vector addNodes(divs.size()); std::map mapp3; -- 2.39.2