From 6e37c72698db0c91776263a178dbe6da39b5781f Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Wed, 18 Mar 2020 12:06:07 +0000 Subject: [PATCH] =?UTF-8?q?EgtGeomKernel=202.2c2=20:=20-=20corretto=20aggi?= =?UTF-8?q?ornamento=20adiacenze=20tra=20triangoli=20in=20TriMesh=20-=20ag?= =?UTF-8?q?giunto=20reset=20hashgrid=20in=20compattazione=20vettore=20tria?= =?UTF-8?q?ngoli=20di=20TriMesh=20-=20allargato=20controllo=20planarit?= =?UTF-8?q?=C3=A0=20loops=20di=20facet=20di=20TriMesh=20-=20corretto=20con?= =?UTF-8?q?trollo=20complanarit=C3=A0=20tra=20triangoli=20in=20IntersTriaT?= =?UTF-8?q?ria.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EgtGeomKernel.rc | Bin 11710 -> 11710 bytes IntersTriaTria.cpp | 2 +- SurfTriMesh.cpp | 25 ++++++++++++++++++------- SurfTriMeshFaceting.cpp | 2 +- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index a38c73dfe239f61d4968b019504cb2ca69abd26a..bca9249ef1fe5a9660eca7e6191c995cef30cbbf 100644 GIT binary patch delta 94 zcmdlNy)SyhFE&P_&A-_cnHh~HD{|{@_Trkr0u;H;XNwSVW8B;$>;>dw2zN+>g;Df- LFmBFL4&ed-Vf-5U delta 94 zcmdlNy)SyhFE&QQ&A-_cnHdcyD{|{@_Trkr0u;H;XNwSVW8B;$>;>dw2zN+>g;Df- LFmBFL4&ed-U|t&X 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) {