diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index a38c73d..bca9249 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/IntersTriaTria.cpp b/IntersTriaTria.cpp index 72b81b0..835a296 100644 --- a/IntersTriaTria.cpp +++ b/IntersTriaTria.cpp @@ -87,7 +87,7 @@ IntersTriaTria( const Triangle3d& trTria1, const Triangle3d& trTria2, Point3d& p // se i triangoli sono complanari if ( nResPP == IPPT_OVERLAPS || ((( nVertPos1 == 0 && nVertNeg1 == 0) || ( nVertPos2 == 0 && nVertNeg2 == 0)) && - ( trTria1.GetN() ^ trTria2.GetN()).SqLen() < SIN_EPS_ANG_SMALL)) + ( trTria1.GetN() ^ trTria2.GetN()).SqLen() < SIN_EPS_ANG_SMALL * SIN_EPS_ANG_SMALL)) return IntersCoplanarTriaTria( trTria1, trTria2, vTria) ; // limito la linea di intersezione con il primo triangolo diff --git a/SurfTriMesh.cpp b/SurfTriMesh.cpp index 577d58c..42b61dc 100644 --- a/SurfTriMesh.cpp +++ b/SurfTriMesh.cpp @@ -553,7 +553,7 @@ SurfTriMesh::GetAllTriaAroundVertex( int nV, INTVECTOR& vT, bool& bCirc) const // verifico esistenza del vertice if ( nV < 0 || nV >= GetVertexSize() || m_vVert[nV].nIdTria == SVT_DEL) - return false ; + return 0 ; // recupero il triangolo puntato dal vertice int nT = m_vVert[nV].nIdTria ; @@ -1329,6 +1329,17 @@ SurfTriMesh::AdjustAdjacencies( void) // sistemo le relazioni tra triangoli e vertici if ( ! AdjustVertices()) return false ; + // matrice di incidenza vertici-triangoli + INTMATRIX mVertTria( GetVertexSize()) ; + for ( int i = 0 ; i < GetTriangleSize() ; ++ i) { + // se triangolo non cancellato + if ( m_vTria[i].nIdVert[0] != SVT_DEL) { + for ( int j = 0 ; j < 3 ; ++ j) { + int nVert = m_vTria[i].nIdVert[j] ; + mVertTria[nVert].emplace_back( i) ; + } + } + } // sistemo i puntatori tra triangoli bool bModif ; do { @@ -1345,12 +1356,10 @@ SurfTriMesh::AdjustAdjacencies( void) // indice altro vertice in altro triangolo int k ; int nN ; - bool bCirc ; - INTVECTOR vT ; // triangoli con il vertice all'inizio dello half-edge - nN = GetAllTriaAroundVertex( nVi, vT, bCirc) ; + nN = int( mVertTria[nVi].size()) ; for ( int l = 0 ; l < nN ; ++ l) { - int nTi = vT[l] ; + int nTi = mVertTria[nVi][l] ; if ( nTi != i) { // se altro vertice in comune, aggiusto le adiacenze dei due triangoli if ( FindVertexInTria( nVf, nTi, k)) { @@ -1367,9 +1376,9 @@ SurfTriMesh::AdjustAdjacencies( void) } } // triangoli con il vertice alla fine dello half-edge - nN = GetAllTriaAroundVertex( nVf, vT, bCirc) ; + nN = int( mVertTria[nVf].size()) ; for ( int l = 0 ; l < nN ; ++ l) { - int nTf = vT[l] ; + int nTf = mVertTria[nVf][l] ; if ( nTf != i) { // se altro vertice in comune, aggiusto le adiacenze dei due triangoli if ( FindVertexInTria( nVi, nTf, k)) { @@ -1619,6 +1628,8 @@ SurfTriMesh::PackTriangles( void) // se non c'è stata compattazione, esco if ( nFirstFree == SVT_NULL) return true ; + // Invalido HashGrid + ResetHashGrids3d() ; // lunghezza vettore indici triangoli int nTIdSize = int( vTId.size()) ; // aggiorno gli indici ai triangoli dai vertici diff --git a/SurfTriMeshFaceting.cpp b/SurfTriMeshFaceting.cpp index d54fb2e..772efcc 100644 --- a/SurfTriMeshFaceting.cpp +++ b/SurfTriMeshFaceting.cpp @@ -413,7 +413,7 @@ SurfTriMesh::GetFacetLoops( int nF, POLYLINEVECTOR& vPL) const for ( int i = 0 ; i < int( vPL.size()) ; ++ i) { Plane3d plPlane ; double dArea ; - if ( ! vPL[i].IsClosedAndFlat( plPlane, dArea)) + if ( ! vPL[i].IsClosedAndFlat( plPlane, dArea, 10 * EPS_SMALL)) return false ; // se loop esterno if ( vtN * plPlane.GetVersN() > 0) {