diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index c16d588..696300b 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/SurfTriMesh.h b/SurfTriMesh.h index f5fa0d2..2082811 100644 --- a/SurfTriMesh.h +++ b/SurfTriMesh.h @@ -360,7 +360,7 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW bool UpdateOneFace( int nFacet, int nT) ; bool UpdateTriaFaceting( int nRefT, int nFacet, const Plane3d& plPlane, int nT) ; bool SetFacet( int nInd, int nT) ; - bool VerifyAdjacTriaFacet( int nT, INTVECTOR& vT) const ; + bool VerifyAdjacTriaFacet( INTVECTOR& vT) const ; bool MarchAlongFacetLoop( int nF, int nT, int nV, int nTimeStamp, PolyLine& PL) const ; bool MarchOneFacetTria( int nF, int& nT, int& nV, int nTimeStamp, PolyLine& PL, bool& bEnd) const ; void ResetHashGrids3d( void) const ; diff --git a/SurfTriMeshFaceting.cpp b/SurfTriMeshFaceting.cpp index 363325b..0188cc4 100644 --- a/SurfTriMeshFaceting.cpp +++ b/SurfTriMeshFaceting.cpp @@ -17,6 +17,7 @@ #include "GeoConst.h" #include "PolygonPlane.h" #include "/EgtDev/Include/EgtPointerOwner.h" +#include #include #include @@ -223,25 +224,33 @@ SurfTriMesh::GetAllTriaInFacet( int nF, INTVECTOR& vT) const vT.reserve( 10) ; vT.push_back( nT) ; m_vTria[nT].nTemp = m_nTimeStamp ; - return VerifyAdjacTriaFacet( nT, vT) ; + return VerifyAdjacTriaFacet( vT) ; } //---------------------------------------------------------------------------- bool -SurfTriMesh::VerifyAdjacTriaFacet( int nT, INTVECTOR& vT) const +SurfTriMesh::VerifyAdjacTriaFacet( INTVECTOR& vT) const { - // verifico i triangoli adiacenti - for ( int j = 0 ; j < 3 ; ++ j) { - int nAdjT = m_vTria[nT].nIdAdjac[j] ; - if ( nAdjT != SVT_NULL && - m_vTria[nAdjT].nTemp != m_nTimeStamp && - m_vTria[nAdjT].nIdFacet == m_vTria[nT].nIdFacet) { - vT.push_back( nAdjT) ; - m_vTria[nAdjT].nTemp = m_nTimeStamp ; - if ( ! VerifyAdjacTriaFacet( nAdjT, vT)) - return false ; + INTVECTOR vStack{ vT.back()} ; + while ( ! vStack.empty()) { + array vNew{ SVT_NULL, SVT_NULL, SVT_NULL} ; + for ( int j = 0 ; j < 3 ; ++ j) { + int nAdjT = m_vTria[vStack.back()].nIdAdjac[j] ; + if ( nAdjT != SVT_NULL && + m_vTria[nAdjT].nTemp != m_nTimeStamp && + m_vTria[nAdjT].nIdFacet == m_vTria[vStack.back()].nIdFacet) { + vT.push_back( nAdjT) ; + vNew[j] = nAdjT ; + m_vTria[nAdjT].nTemp = m_nTimeStamp ; + } + } + vStack.pop_back() ; + for ( int j = 0 ; j < 3 ; ++ j) { + if ( vNew[j] != SVT_NULL) + vStack.push_back( vNew[j]) ; } } + return true ; }