diff --git a/SurfTriMesh.cpp b/SurfTriMesh.cpp index 9b483ed..377a521 100644 --- a/SurfTriMesh.cpp +++ b/SurfTriMesh.cpp @@ -145,7 +145,11 @@ SurfTriMesh::AddTriangle( const int nIdVert[3]) Vector3d vtV2 = m_vVert[nIdVert[2]].ptP - m_vVert[nIdVert[1]].ptP ; // normale da prodotto vettoriale Vector3d vtN = vtV1 ^ vtV2 ; - if ( vtN.IsZero()) + double dSqN = vtN.SqLen() ; + if ( dSqN < SQ_EPS_ZERO) + return SVT_DEL ; + // verifico la distanza minima tra i vertici e i lati opposti + if ( dSqN < SQ_EPS_TRIA_H * max( { vtV1.SqLen(), vtV2.SqLen(), ( vtV1 + vtV2).SqLen()})) return SVT_DEL ; // imposto ricalcolo m_nStatus = TO_VERIFY ; @@ -1643,7 +1647,7 @@ SurfTriMesh::PackTriangles( void) continue ; if ( vOId[j] < 0 || vOId[j] >= nTIdSize) return false ; - m_vTria[nId].nIdAdjac[j] = vTId[vOId[j]] ; + m_vTria[nId].nIdAdjac[j] = ( vTId[vOId[j]] == SVT_DEL ? SVT_NULL : vTId[vOId[j]]) ; } } // aggiorno gli indici ai triangoli dalle facets @@ -1846,7 +1850,7 @@ SurfTriMesh::CreateByPointCurve( const Point3d& ptP, const PolyLine& PL) // inserisco il triangolo A2p -> A1p -> A1s if ( AddTriangle( nIdV) == SVT_NULL) return false ; - // aggirono indice punto precedente su curva + // aggiorno indice punto precedente su curva nIdV[1] = nIdV[2] ; } // se chiusa aggiungo l'ultimo triangolo (non il vertice perchè è il primo della curva) @@ -3284,9 +3288,10 @@ SurfTriMesh::Cut( const Plane3d& plPlane, bool bSaveOnEq) int nIdVert[3] = { m_vTria[i].nIdVert[0], m_vTria[i].nIdVert[1], m_vTria[i].nIdVert[2]} ; nIdVert[nVertOut] = nNewV ; int nIdTria = AddTriangle( nIdVert) ; - if ( ! IsValidSvt( nIdTria)) + if ( nIdTria == SVT_NULL) return false ; - m_vTria[nIdTria].nTemp = m_nTimeStamp ; + if ( nIdTria != SVT_DEL) + m_vTria[nIdTria].nTemp = m_nTimeStamp ; // cancello il vecchio triangolo RemoveTriangle( i) ; } @@ -3327,9 +3332,10 @@ SurfTriMesh::Cut( const Plane3d& plPlane, bool bSaveOnEq) nIdVert[nVertOut1] = nNewV1 ; nIdVert[nVertOut2] = nNewV2 ; int nIdTria = AddTriangle( nIdVert) ; - if ( ! IsValidSvt( nIdTria)) + if ( nIdTria == SVT_NULL) return false ; - m_vTria[nIdTria].nTemp = m_nTimeStamp ; + if ( nIdTria != SVT_DEL) + m_vTria[nIdTria].nTemp = m_nTimeStamp ; // cancello il vecchio triangolo RemoveTriangle( i) ; } @@ -3382,10 +3388,12 @@ SurfTriMesh::Cut( const Plane3d& plPlane, bool bSaveOnEq) } int nIdTria1 = AddTriangle( nIdVert1) ; int nIdTria2 = AddTriangle( nIdVert2) ; - if ( ! IsValidSvt( nIdTria1) || ! IsValidSvt( nIdTria2)) + if ( nIdTria1 == SVT_NULL || nIdTria2 == SVT_NULL) return false ; - m_vTria[nIdTria1].nTemp = m_nTimeStamp ; - m_vTria[nIdTria2].nTemp = m_nTimeStamp ; + if ( nIdTria1 != SVT_DEL) + m_vTria[nIdTria1].nTemp = m_nTimeStamp ; + if ( nIdTria2 != SVT_DEL) + m_vTria[nIdTria2].nTemp = m_nTimeStamp ; // cancello il vecchio triangolo RemoveTriangle( i) ; } @@ -3579,7 +3587,8 @@ SurfTriMesh::ClonePart( int nPart) const int nNewInd[3] = { pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[0]].ptP), pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[1]].ptP), pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[2]].ptP)} ; - pSurfTM->AddTriangle( nNewInd) ; + if ( pSurfTM->AddTriangle( nNewInd) == SVT_NULL) + return nullptr ; } } diff --git a/SurfTriMesh.h b/SurfTriMesh.h index 3a6825a..27805ac 100644 --- a/SurfTriMesh.h +++ b/SurfTriMesh.h @@ -291,7 +291,7 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW void ResetHashGrids3d( void) const ; bool VerifyHashGrids3d( void) const ; bool VerifyConnection( void) const ; - bool DecomposeLoop( CHAINVECTOR& cvOpenChain, INTVECTOR& vnDegVec, std::vector& cvBoundClosedLoopVec, BOOLVECTOR& vbInOut) ; + bool DecomposeLoop( CHAINVECTOR& cvOpenChain, INTVECTOR& vnDegVec, PNTMATRIX& cvBoundClosedLoopVec, BOOLVECTOR& vbInOut) ; bool IntersectTriMeshTriangle( SurfTriMesh& Other) ; bool IdentifyParts( void) const ; bool RemoveTJunction( void) ; diff --git a/SurfTriMeshBooleans.cpp b/SurfTriMeshBooleans.cpp index c1de08f..6d6c1e4 100644 --- a/SurfTriMeshBooleans.cpp +++ b/SurfTriMeshBooleans.cpp @@ -32,7 +32,7 @@ using namespace std ; //---------------------------------------------------------------------------- -int +static int IntersRectangleTriangle( const Point3d& ptP, const Vector3d& vtL1, const Vector3d& vtL2, const Triangle3d& trTria, Point3d& ptStSeg, Point3d& ptEnSeg) { @@ -116,7 +116,7 @@ IntersRectangleTriangle( const Point3d& ptP, const Vector3d& vtL1, const Vector3 } //---------------------------------------------------------------------------- -bool +static bool ChangeStart( const Point3d& ptNewStart, PNTVECTOR& Loop) { // Cerco se esiste un tratto del loop chiuso su cui giace il punto @@ -178,7 +178,7 @@ ChangeStart( const Point3d& ptNewStart, PNTVECTOR& Loop) } //---------------------------------------------------------------------------- -bool +static bool SplitAtPoint( const Point3d& ptStop, const PNTVECTOR& Loop, PNTVECTOR& Loop1, PNTVECTOR& Loop2) { // Cerco se esiste un tratto del loop chiuso su cui giace il punto @@ -224,7 +224,7 @@ SplitAtPoint( const Point3d& ptStop, const PNTVECTOR& Loop, PNTVECTOR& Loop1, PN } //---------------------------------------------------------------------------- -bool +static bool AddChainToChain( const Chain& ChainToAdd, PNTVECTOR& OrigChain) { // Se la catena da aggiungere è vuota, non devo fare alcunchè @@ -253,20 +253,6 @@ AddChainToChain( const Chain& ChainToAdd, PNTVECTOR& OrigChain) } return true ; } - /*else if ( AreSamePointApprox( OrigChain[0], ChainToAdd[nLastToAdd].ptEn)) { - int nOldDim = OrigChain.size() ; - int nNewDim = nOldDim + ChainToAdd.size() + 1 ; - OrigChain.resize( nNewDim) ; - int nShift = std::max( nNewDim - nOldDim, 0) ; - for ( int nPt = nOldDim - 1 ; nPt >= 0 ; -- nPt) { - OrigChain[nPt + nShift] = OrigChain[nPt] ; - } - for ( int nPt = 0 ; nPt < int( ChainToAdd.size()) ; ++ nPt) { - OrigChain[nPt] = ChainToAdd[nPt].ptSt ; - } - OrigChain[int( ChainToAdd.size())] = ChainToAdd[int(ChainToAdd.size()) - 1].ptEn ; - return true ; - }*/ else return false ; } @@ -541,7 +527,7 @@ SurfTriMesh::GeneralizedCut( const ICurve& cvCurve, bool bSaveOnEq) cvFirstLoop.emplace_back( trTria.GetP( 1)) ; cvFirstLoop.emplace_back( trTria.GetP( 2)) ; - vector cvBoundClosedLoopVec ; + PNTMATRIX cvBoundClosedLoopVec ; cvBoundClosedLoopVec.emplace_back(cvFirstLoop); BOOLVECTOR vbInOut ; vbInOut.push_back( true) ; @@ -741,7 +727,7 @@ SurfTriMesh::GeneralizedCut( const ICurve& cvCurve, bool bSaveOnEq) //---------------------------------------------------------------------------- bool -SurfTriMesh::DecomposeLoop( CHAINVECTOR& cvOpenChain, INTVECTOR& vnDegVec, vector& cvBoundClosedLoopVec, BOOLVECTOR& vbInOut) +SurfTriMesh::DecomposeLoop( CHAINVECTOR& cvOpenChain, INTVECTOR& vnDegVec, PNTMATRIX& cvBoundClosedLoopVec, BOOLVECTOR& vbInOut) { // Divido il loop di partenza in sotto-loop int nIterationCount = 0 ; @@ -934,11 +920,11 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other) if ( m_nStatus != OK || ! SurfB.IsValid()) return false ; // Unordered map dei segmenti di intersezione - std::unordered_map LineMapA ; - std::unordered_map LineMapB ; + unordered_map< int, Chain> LineMapA ; + unordered_map< int, Chain> LineMapB ; // Unordered map dei triangoli ambigui (intersezione edge-edge) - std::unordered_map > AmbiguosA ; - std::unordered_map > AmbiguosB ; + unordered_map< int, TRIA3DVECTOR> AmbiguosA ; + unordered_map< int, TRIA3DVECTOR> AmbiguosB ; // Ciclo sui triangoli delle mesh int nTriaNumA = GetTriangleSize() ; int nTriaNumB = SurfB.GetTriangleSize() ; @@ -1059,7 +1045,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other) else if ( bIntOnEndgeA && bIntOnEndgeB) { auto itA = AmbiguosA.find( nTA) ; if ( itA == AmbiguosA.end()) { - std::vector vVecTriaB ; + TRIA3DVECTOR vVecTriaB ; vVecTriaB.emplace_back( trTriaB) ; AmbiguosA.emplace( nTA, vVecTriaB) ; } @@ -1068,7 +1054,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other) } auto itB = AmbiguosB.find( nTB) ; if ( itB == AmbiguosB.end()) { - std::vector vVecTriaA ; + TRIA3DVECTOR vVecTriaA ; vVecTriaA.emplace_back( trTriaA) ; AmbiguosB.emplace( nTB, vVecTriaA) ; } @@ -1094,7 +1080,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other) it->second.erase( it->second.begin() + nS2) ; it->second.erase( it->second.begin() + nS1) ; -- nS1 ; - -- nS2 ; + break ; } } } @@ -1242,7 +1228,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other) cvFirstLoop.emplace_back( trTriaA.GetP( 1)) ; cvFirstLoop.emplace_back( trTriaA.GetP( 2)) ; - vector cvBoundClosedLoopVec ; + PNTMATRIX cvBoundClosedLoopVec ; cvBoundClosedLoopVec.emplace_back( cvFirstLoop) ; BOOLVECTOR vbInOut ; vbInOut.push_back( true) ; @@ -1264,7 +1250,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other) // Assumo che i loop interni a uno dei loop creati fino ad'ora siano tutti sullo stesso livello. // Il caso generale si risolve con una struttura ad albero in cui il nodi corrispondente a un // loop è figlio del nodo corrispondente al loop che lo contiene. - vector vInnerLoop ; + INTVECTOR vInnerLoop ; for ( int nCLI = 0 ; nCLI < int( cvClosedChain.size()) ; ++ nCLI) { Point3d ptLoopStart = cvClosedChain[nCLI][0].ptSt ; double dMinDist = DBL_MAX ; @@ -1499,7 +1485,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other) it->second.erase( it->second.begin() + nS2) ; it->second.erase( it->second.begin() + nS1) ; -- nS1 ; - -- nS2 ; + break ; } } } @@ -1648,7 +1634,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other) cvFirstLoop.emplace_back( trTriaB.GetP( 1)) ; cvFirstLoop.emplace_back( trTriaB.GetP( 2)) ; - vector cvBoundClosedLoopVec ; + PNTMATRIX cvBoundClosedLoopVec ; cvBoundClosedLoopVec.emplace_back( cvFirstLoop) ; BOOLVECTOR vbInOut ; vbInOut.push_back( true) ; @@ -1669,7 +1655,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other) // Assumo che i loop interni a uno dei loop creati fino ad'ora siano tutti sullo stesso livello. // Il caso generale si risolve con una struttura ad albero in cui il nodi corrispondente a un // loop è figlio del nodo corrispondente al loop che lo contiene. - vector vInnerLoop ; + INTVECTOR vInnerLoop ; for ( int nCLI = 0 ; nCLI < int( cvClosedChain.size()) ; ++ nCLI) { Point3d ptLoopStart = cvClosedChain[nCLI][0].ptSt ; double dMinDist = DBL_MAX ; @@ -2126,7 +2112,7 @@ SurfTriMesh::RemoveTJunction( void) Tria.nTemp = m_nTimeStamp ; // Incremento time stamp ++ m_nTimeStamp ; - std::vector IndexesMatrix ; + INTMATRIX IndexesMatrix ; for ( int nT = 0 ; nT < int( m_vTria.size()) ; ++ nT) { // Se il triangolo non è valido, continuo. Triangle3d trTria ; @@ -2410,11 +2396,9 @@ SurfTriMesh::Add( const ISurfTriMesh& Other) AddTriangle( nNewVert) ; } } - bool bContinue = ( AdjustVertices() && DoCompacting()) ; - if ( bContinue) - RemoveTJunction() ; - else + if ( ! AdjustVertices() || ! DoCompacting()) return false ; + RemoveTJunction() ; return ( AdjustVertices() && DoCompacting()) ; } @@ -2442,11 +2426,9 @@ SurfTriMesh::Intersect( const ISurfTriMesh& Other) AddTriangle( nNewVert) ; } } - bool bContinue = ( AdjustVertices() && DoCompacting()) ; - if ( bContinue) - RemoveTJunction() ; - else + if ( ! AdjustVertices() || ! DoCompacting()) return false ; + RemoveTJunction() ; return ( AdjustVertices() && DoCompacting()) ; } @@ -2475,11 +2457,9 @@ SurfTriMesh::Subtract( const ISurfTriMesh& Other) AddTriangle( nNewVert) ; } } - bool bContinue = ( AdjustVertices() && DoCompacting()) ; - if ( bContinue) - RemoveTJunction() ; - else + if ( ! AdjustVertices() || ! DoCompacting()) return false ; + RemoveTJunction() ; return ( AdjustVertices() && DoCompacting()) ; }