From b316991220e3aa902ff97f32f7ca3a8893406204 Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 16 Jul 2014 18:21:30 +0200 Subject: [PATCH] + fix mesh trimming --- src/Base/Tools2D.cpp | 16 ++++++++++++++++ src/Base/Tools2D.h | 3 ++- src/Mod/Mesh/App/Core/Trim.cpp | 11 +++++++---- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/Base/Tools2D.cpp b/src/Base/Tools2D.cpp index 558f97e7c..9f3dd3155 100644 --- a/src/Base/Tools2D.cpp +++ b/src/Base/Tools2D.cpp @@ -431,3 +431,19 @@ void Polygon2D::Intersect (const Polygon2D &rclPolygon, std::list &rc rclResultPolygonList.push_back(clResultPolygon); } +bool Polygon2D::Intersect (const Vector2D &rclV, double eps) const +{ + if (_aclVct.size() < 2) + return false; + + size_t numPts = GetCtVectors(); + for (size_t i = 0; i < numPts; i++) { + Vector2D clPt0 = (*this)[i]; + Vector2D clPt1 = (*this)[(i+1)%numPts]; + Line2D clLine(clPt0, clPt1); + if (clLine.Intersect(rclV, eps)) + return true; + } + + return false; +} diff --git a/src/Base/Tools2D.h b/src/Base/Tools2D.h index 2d053507d..d27fbee30 100644 --- a/src/Base/Tools2D.h +++ b/src/Base/Tools2D.h @@ -154,7 +154,8 @@ public: // misc BoundBox2D CalcBoundBox (void) const; bool Contains (const Vector2D &rclV) const; - void Intersect (const Polygon2D &rclPolygon, std::list &rclResultPolygonList) const; + void Intersect (const Polygon2D &rclPolygon, std::list &rclResultPolygonList) const; + bool Intersect (const Vector2D &rclV, double eps) const; private: std::vector _aclVct; diff --git a/src/Mod/Mesh/App/Core/Trim.cpp b/src/Mod/Mesh/App/Core/Trim.cpp index 880ed965e..107968256 100644 --- a/src/Mod/Mesh/App/Core/Trim.cpp +++ b/src/Mod/Mesh/App/Core/Trim.cpp @@ -346,18 +346,21 @@ bool MeshTrimming::CreateFacets(unsigned long ulFacetPos, int iSide, const std:: // no intersection point found => triangle is only touched at a corner point if (raclPoints.size() == 0) { MeshFacet& facet = myMesh._aclFacetArray[ulFacetPos]; - int iCtPts=0; + int iCtPtsIn=0; + int iCtPtsOn=0; Base::Vector3f clFacPnt; Base::Vector2D clProjPnt; for (int i=0; i<3; i++) { clFacPnt = (*myProj)(myMesh._aclPointArray[facet._aulPoints[i]]); clProjPnt = Base::Vector2D(clFacPnt.x, clFacPnt.y); - if (myPoly.Contains(clProjPnt) == myInner) - ++iCtPts; + if (myPoly.Intersect(clProjPnt, MESH_MIN_PT_DIST)) + ++iCtPtsOn; + else if (myPoly.Contains(clProjPnt) == myInner) + ++iCtPtsIn; } // in this case we can use the original triangle - if (iCtPts < 3) + if (iCtPtsIn != (3 - iCtPtsOn)) aclNewFacets.push_back(myMesh.GetFacet(ulFacetPos)); } // one intersection point found => triangle is also touched at a corner point