From 2d70d27d85b03d5bb1d7ecafe2ae8fc7e2f108c8 Mon Sep 17 00:00:00 2001 From: DarioS Date: Sun, 14 Nov 2021 12:32:28 +0100 Subject: [PATCH] EgtGeomKernel 2.3k4 : - piccole modifiche estetiche e cambio versione. --- EgtGeomKernel.rc | Bin 11718 -> 11718 bytes SurfTriMeshCuts.cpp | 100 ++++++++++++++++++++++---------------------- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index d4263c2bf225d6e443480702617b546152279055..2bed869af1d3e371655ae011860da7917ae26ef6 100644 GIT binary patch delta 110 zcmX>WeJpyzA2vpl&G-4vGfl1&(wY2&Q;pGNvZAo=W*@FeEMOU1X1ItOWeJpyzA2vqg&G-4vGfl1&(wY2&Q;pGhvZAo=W*@FeEMOU1X1ItO diff --git a/SurfTriMeshCuts.cpp b/SurfTriMeshCuts.cpp index 8811479..4d29524 100644 --- a/SurfTriMeshCuts.cpp +++ b/SurfTriMeshCuts.cpp @@ -64,6 +64,45 @@ SurfTriMesh::Cut( const Plane3d& plPlane, bool bSaveOnEq) return true ; } +//---------------------------------------------------------------------------- +bool +SurfTriMesh::CutByTriangles( const Plane3d& plPlane, bool bSaveOnEq, bool& bModif) +{ + // la superficie deve essere validata + if ( m_nStatus != OK) + return false ; + + // classifico i vertici rispetto al piano + double dTol = max( min( 0.5 * m_dLinTol, 10 * EPS_SMALL), EPS_SMALL) ; + for ( int i = 0 ; i < GetVertexSize() ; ++ i) { + double dDist = DistPointPlane( m_vVert[i].ptP, plPlane) ; + if ( abs( dDist) < dTol) { + m_vVert[i].nTemp = 0 ; + if ( abs( dDist) > EPS_SMALL) + m_vVert[i].ptP -= plPlane.GetVersN() * dDist ; + } + else if ( dDist > 0) + m_vVert[i].nTemp = +1 ; + else + m_vVert[i].nTemp = -1 ; + } + + // aggiorno timestamp dei triangoli + for ( auto& Tria : m_vTria) + Tria.nTemp = m_nTimeStamp ; + ++ m_nTimeStamp ; + + // sistemo i triangoli (eventualmente li elimino) + for ( int i = 0 ; i < GetTriangleSize() ; ++ i) { + // salto i triangoli cancellati e quelli aggiunti + if ( m_vTria[i].nIdVert[0] == SVT_DEL || m_vTria[i].nTemp == m_nTimeStamp) + continue ; + CutTriangleByPlane( i, plPlane, bSaveOnEq, bModif) ; + } + + return true ; +} + //---------------------------------------------------------------------------- bool SurfTriMesh::CutTriangleByPlane( int nT, const Plane3d& plPlane, bool bSaveOnEq, bool& bModif) @@ -125,7 +164,7 @@ SurfTriMesh::CutTriangleByPlane( int nT, const Plane3d& plPlane, bool bSaveOnEq, m_vVert[m_vTria[nT].nIdVert[nVertOut]].ptP, dDistIn / ( dDistIn + dDistOut)) ; // inserisco il nuovo vertice - int nNewV = AddVertex( ptInt) ; + int nNewV = AddVertex( ptInt) ; // inserisco il nuovo triangolo int nIdVert[3] = { m_vTria[nT].nIdVert[0], m_vTria[nT].nIdVert[1], m_vTria[nT].nIdVert[2]} ; nIdVert[nVertOut] = nNewV ; @@ -135,7 +174,7 @@ SurfTriMesh::CutTriangleByPlane( int nT, const Plane3d& plPlane, bool bSaveOnEq, if ( nIdTria != SVT_DEL) m_vTria[nIdTria].nTemp = m_nTimeStamp ; // cancello il vecchio triangolo - RemoveTriangle( nT) ; + RemoveTriangle( nT) ; } // se ha un vertice all'interno e due all'esterno -> 2 nuovi vertici e 1 nuovo triangolo else if ( nDisc == 1) { @@ -167,8 +206,8 @@ SurfTriMesh::CutTriangleByPlane( int nT, const Plane3d& plPlane, bool bSaveOnEq, m_vVert[m_vTria[nT].nIdVert[nVertOut2]].ptP, dDistIn / ( dDistIn + dDistOut2)) ; // inserisco i nuovi vertici - int nNewV1 = AddVertex( ptInt1) ; - int nNewV2 = AddVertex( ptInt2) ; + int nNewV1 = AddVertex( ptInt1) ; + int nNewV2 = AddVertex( ptInt2) ; // inserisco il nuovo triangolo int nIdVert[3] = { m_vTria[nT].nIdVert[0], m_vTria[nT].nIdVert[1], m_vTria[nT].nIdVert[2]} ; nIdVert[nVertOut1] = nNewV1 ; @@ -179,7 +218,7 @@ SurfTriMesh::CutTriangleByPlane( int nT, const Plane3d& plPlane, bool bSaveOnEq, if ( nIdTria != SVT_DEL) m_vTria[nIdTria].nTemp = m_nTimeStamp ; // cancello il vecchio triangolo - RemoveTriangle( nT) ; + RemoveTriangle( nT) ; } // altrimenti ha due vertici all'interno e uno all'esterno -> 2 nuovi vertici e 2 nuovi triangoli else { @@ -211,8 +250,8 @@ SurfTriMesh::CutTriangleByPlane( int nT, const Plane3d& plPlane, bool bSaveOnEq, m_vVert[m_vTria[nT].nIdVert[nVertOut]].ptP, dDistIn2 / ( dDistIn2 + dDistOut)) ; // inserisco i nuovi vertici - int nNewV1 = AddVertex( ptInt1) ; - int nNewV2 = AddVertex( ptInt2) ; + int nNewV1 = AddVertex( ptInt1) ; + int nNewV2 = AddVertex( ptInt2) ; // inserisco i nuovi triangoli int nIdVert1[3] = { m_vTria[nT].nIdVert[0], m_vTria[nT].nIdVert[1], m_vTria[nT].nIdVert[2]} ; int nIdVert2[3] = { m_vTria[nT].nIdVert[0], m_vTria[nT].nIdVert[1], m_vTria[nT].nIdVert[2]} ; @@ -237,51 +276,12 @@ SurfTriMesh::CutTriangleByPlane( int nT, const Plane3d& plPlane, bool bSaveOnEq, if ( nIdTria2 != SVT_DEL) m_vTria[nIdTria2].nTemp = m_nTimeStamp ; // cancello il vecchio triangolo - RemoveTriangle( nT) ; + RemoveTriangle( nT) ; } } return true ; } -//---------------------------------------------------------------------------- -bool -SurfTriMesh::CutByTriangles( const Plane3d& plPlane, bool bSaveOnEq, bool& bModif) -{ - // la superficie deve essere validata - if ( m_nStatus != OK) - return false ; - - // classifico i vertici rispetto al piano - double dTol = max( min( 0.5 * m_dLinTol, 10 * EPS_SMALL), EPS_SMALL) ; - for ( int i = 0 ; i < GetVertexSize() ; ++ i) { - double dDist = DistPointPlane( m_vVert[i].ptP, plPlane) ; - if ( abs( dDist) < dTol) { - m_vVert[i].nTemp = 0 ; - if ( abs( dDist) > EPS_SMALL) - m_vVert[i].ptP -= plPlane.GetVersN() * dDist ; - } - else if ( dDist > 0) - m_vVert[i].nTemp = +1 ; - else - m_vVert[i].nTemp = -1 ; - } - - // aggiorno timestamp dei triangoli - for ( auto& Tria : m_vTria) - Tria.nTemp = m_nTimeStamp ; - ++ m_nTimeStamp ; - - // sistemo i triangoli (eventualmente li elimino) - for ( int i = 0 ; i < GetTriangleSize() ; ++ i) { - // salto i triangoli cancellati e quelli aggiunti - if ( m_vTria[i].nIdVert[0] == SVT_DEL || m_vTria[i].nTemp == m_nTimeStamp) - continue ; - CutTriangleByPlane( i, plPlane, bSaveOnEq, bModif) ; - } - - return true ; -} - //---------------------------------------------------------------------------- bool SurfTriMesh::CutByFacets( const Plane3d& plPlane, bool bSaveOnEq, bool& bModif) @@ -357,7 +357,7 @@ SurfTriMesh::CutByFacets( const Plane3d& plPlane, bool bSaveOnEq, bool& bModif) if ( m_vTria[nT].nTempPart == 0 || m_vTria[nT].nTempPart == -1 || m_vTria[nT].nTempPart == -2 || - ( ! bSaveOnEq && m_vTria[nT].nTempPart == 2)) { + ( ! bSaveOnEq && m_vTria[nT].nTempPart == 2)) { RemoveTriangle( nT) ; bModif = true ; } @@ -532,7 +532,7 @@ SurfTriMesh::GeneralizedCut( const ICurve& cvCurve, bool bSaveOnEq) bTriaCenIn = ( nSide2 == MDS_LEFT && bSaveOnEq) ; } } - + // Vettore di catene di punti e flag sulla complanarità del triangolo con uno dei rettangoli CHAINVECTOR vChain ; bool bTriaOn = false ; @@ -567,7 +567,7 @@ SurfTriMesh::GeneralizedCut( const ICurve& cvCurve, bool bSaveOnEq) // Assegno i dati di intersezione IntSegment CurInters ; CurInters.ptSt = ptSegSt ; - CurInters.ptEn = ptSegEn ; + CurInters.ptEn = ptSegEn ; // Inserisco nella catena if ( ! bChain) { vChain[nChainCnt - 1].emplace_back( CurInters) ;