diff --git a/SurfTriMeshBooleans.cpp b/SurfTriMeshBooleans.cpp index eca908b..21f052c 100644 --- a/SurfTriMeshBooleans.cpp +++ b/SurfTriMeshBooleans.cpp @@ -495,7 +495,7 @@ SurfTriMesh::GeneralizedCut( const ICurve& cvCurve, bool bSaveOnEq) vPL.emplace_back( plInLoop) ; PNTVECTOR vPt ; INTVECTOR vTr ; - if ( Triangulate().Make( vPL, vPt, vTr)) { + if ( Triangulate().Make( vPL, vPt, vTr, TrgType::TRG_DEL_QUALITY)) { // Inserisco i nuovi triangoli for ( int n = 0 ; n < int( vTr.size()) - 2 ; n += 3) { int nNewTriaVertId[3] = { vTr[n], vTr[n + 1], vTr[n + 2] } ; @@ -711,7 +711,7 @@ SurfTriMesh::GeneralizedCut( const ICurve& cvCurve, bool bSaveOnEq) Triangulate CreateTriangulation ; PNTVECTOR vPt ; INTVECTOR vTr ; - if ( Triangulate().Make( vplPolyVec[nLoop], vPt, vTr)) { + if ( Triangulate().Make( vplPolyVec[nLoop], vPt, vTr, TrgType::TRG_DEL_QUALITY)) { // Inserisco i nuovi triangoli for ( int n = 0 ; n < int( vTr.size()) - 2 ; n += 3) { int nNewTriaVertId[3] = { vTr[n], vTr[n + 1], vTr[n + 2] } ; @@ -1350,7 +1350,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT // Eseguo triangolazione PNTVECTOR vPt ; INTVECTOR vTr ; - if ( Triangulate().Make( vplPolyVec[nLoop], vPt, vTr)) { + if ( Triangulate().Make( vplPolyVec[nLoop], vPt, vTr, TrgType::TRG_DEL_QUALITY)) { // Inserisco i nuovi triangoli for ( int n = 0 ; n < int( vTr.size()) - 2 ; n += 3) { int nNewTriaVertId[3] = { vTr[n], vTr[n + 1], vTr[n + 2] } ; @@ -1446,7 +1446,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT PNTVECTOR vPt ; INTVECTOR vTr ; - if ( Triangulate().Make( vPolygons, vPt, vTr)) { + if ( Triangulate().Make( vPolygons, vPt, vTr, TrgType::TRG_DEL_QUALITY)) { // Inserisco i nuovi triangoli for ( int n = 0 ; n < int( vTr.size()) - 2 ; n += 3) { int nNewTriaVertId[3] = { vTr[n], vTr[n + 1], vTr[n + 2]} ; @@ -1582,7 +1582,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT } for ( int nL = 1 ; nL < int( vPolygons.size()) ; ++ nL) { vPolygons[nL].Invert() ; - if ( Triangulate().Make( vPolygons[nL], vPt, vTr)) { + if ( Triangulate().Make( vPolygons[nL], vPt, vTr, TrgType::TRG_DEL_QUALITY)) { // Inserisco i nuovi triangoli for (int n = 0 ; n < int( vTr.size()) - 2 ; n += 3) { int nNewTriaVertId[3] = { vTr[n], vTr[n + 1], vTr[n + 2]} ; @@ -4270,7 +4270,7 @@ SurfTriMesh::RetriangulateFacetPieces( const PieceMap& NewFacet, for ( int nPart = 0 ; nPart < nPartNum ; ++ nPart) { PNTVECTOR vPt ; INTVECTOR vTr ; - if ( Triangulate().Make( PiecesVector[nPart].vPieceLoop, vPt, vTr)) { + if ( Triangulate().Make( PiecesVector[nPart].vPieceLoop, vPt, vTr, TrgType::TRG_DEL_QUALITY)) { // Inserisco i nuovi triangoli for ( int n = 0 ; n < int( vTr.size()) - 2 ; n += 3) { int nNewTriaVertId[3] = { vTr[n], vTr[n + 1], vTr[n + 2]} ; @@ -4362,7 +4362,7 @@ SurfTriMesh::RetriangulateFacetPieces( const PieceMap& NewFacet, bool bContinue = SplitPolyLineContour( PiecesVector[nPart].vPieceLoop, vSubPieceLoop[0], vSubPieceLoop[1]) ; while ( bContinue) { for ( int nSub = 0 ; nSub < int( vSubPieceLoop.size()) ; ++ nSub) { - if (Triangulate().Make(vSubPieceLoop[nSub], vPt, vTr)) { + if (Triangulate().Make(vSubPieceLoop[nSub], vPt, vTr, TrgType::TRG_DEL_QUALITY)) { // Inserisco i nuovi triangoli for (int n = 0; n < int(vTr.size()) - 2; n += 3) { int nNewTriaVertId[3] = { vTr[n], vTr[n + 1], vTr[n + 2] }; diff --git a/Triangulate.cpp b/Triangulate.cpp index 408f3d4..8341936 100644 --- a/Triangulate.cpp +++ b/Triangulate.cpp @@ -233,18 +233,31 @@ Triangulate::Make( const POLYLINEVECTOR& vPL, PNTVECTOR& vPt, INTVECTOR& vTr, Tr bool Triangulate::MakeByDelaunay( const POLYLINEVECTOR& vPL, PNTVECTOR& vPt, INTVECTOR& vTr, bool bConforming, bool bQuality) { + Plane3d plPlane ; + double dArea; + if ( ! vPL[0].IsClosedAndFlat( plPlane, dArea, 50 * EPS_SMALL)) + return false ; + Frame3d frLoc ; + frLoc.Set( plPlane.GetPoint(), plPlane.GetVersN()) ; + + POLYLINEVECTOR vMyPL = vPL ; + for ( size_t t = 0 ; t < vPL.size() ; ++ t) { + vMyPL[t].ToLoc( frLoc) ; + } + // vertici e constraint per la triangolazione vector vDelaunayVert ; - INTVECTOR vDelaunayConstr ; + INTVECTOR vDelaunayConstr ; + - for ( size_t i = 0 ; i < vPL.size() ; i++) { + for ( size_t i = 0 ; i < vMyPL.size() ; i++) { Point3d ptFirst, pt ; - vPL[i].GetFirstPoint( ptFirst) ; + vMyPL[i].GetFirstPoint( ptFirst) ; vDelaunayVert.push_back( Delaunay::Point( ptFirst.x, ptFirst.y)) ; int nFirst = vDelaunayVert.size() - 1 ; // indice del primo punto della polyline fra i vertici della triangolazione vDelaunayConstr.push_back( nFirst) ; - while ( vPL[i].GetNextPoint( pt)) { + while ( vMyPL[i].GetNextPoint( pt)) { vDelaunayVert.push_back( Delaunay::Point( pt.x, pt.y)) ; // nei constraint gli indici vanno inseriti due volte perchè vengono letti a due a due per definire un segmento vDelaunayConstr.push_back( vDelaunayVert.size() - 1) ; @@ -259,14 +272,14 @@ Triangulate::MakeByDelaunay( const POLYLINEVECTOR& vPL, PNTVECTOR& vPt, INTVECTO // holes : sono definiti da un punto interno al buco std::vector vDelaunayHoles ; - for ( size_t i = 1 ; i < vPL.size() ; i++) { + for ( size_t i = 1 ; i < vMyPL.size() ; i++) { Point3d pt ; CurveComposite * pCrvHole = CreateBasicCurveComposite() ; - pCrvHole->FromPolyLine( vPL[i]) ; + pCrvHole->FromPolyLine( vMyPL[i]) ; pCrvHole->GetCentroid( pt) ; // se il centroide fosse esterno, cerco per tentativi un punto qualsiasi all'interno della curva double dPar = 0.5 ; - while ( ! IsPointInsidePolyLine( pt, vPL[i])) { + while ( ! IsPointInsidePolyLine( pt, vMyPL[i])) { double dParS, dParE ; pCrvHole->GetDomain( dParS, dParE) ; if ( dPar > dParE) @@ -284,9 +297,9 @@ Triangulate::MakeByDelaunay( const POLYLINEVECTOR& vPL, PNTVECTOR& vPt, INTVECTO // parti concave PNTVECTOR vPtConvexHull ; - vPL[0].GetConvexHullXY( vPtConvexHull) ; + vMyPL[0].GetConvexHullXY( vPtConvexHull) ; CurveComposite* pCrv = CreateBasicCurveComposite() ; - pCrv->FromPolyLine( vPL[0]) ; + pCrv->FromPolyLine( vMyPL[0]) ; for ( size_t i = 0 ; i < vPtConvexHull.size() ; i ++) { size_t NextIdx = ( i == vPtConvexHull.size() - 1) ? 0 : i + 1 ; @@ -338,8 +351,12 @@ Triangulate::MakeByDelaunay( const POLYLINEVECTOR& vPL, PNTVECTOR& vPt, INTVECTO // vertici std::vector< Delaunay::Point> vVertex = trGenerator.MyVertexTraverse() ; - for ( size_t i = 0 ; i < vVertex.size() ; i ++) - vPt.push_back( Point3d( vVertex[i][0], vVertex[i][1])) ; + for (size_t i = 0; i < vVertex.size(); i++) { + Point3d pt( vVertex[i][0], vVertex[i][1]) ; + pt.ToGlob( frLoc) ; + vPt.push_back( pt) ; + } + // triangoli vTr = trGenerator.MyTriangleTraverse() ;