From dcea0114b37227bf886feb59ede2521be8e7a204 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 13 Aug 2018 14:57:13 +0000 Subject: [PATCH] EgtGeomKernel 1.9h2 : - ottimizzazione calcolo triangoli di Zmap. --- EgtGeomKernel.rc | Bin 11710 -> 11710 bytes VolZmap.h | 6 +- VolZmapCreation.cpp | 135 +++------ VolZmapGraphics.cpp | 651 ++++++++++++++++++++++---------------------- 4 files changed, 364 insertions(+), 428 deletions(-) diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 4e1e649ecaba4c591e99ceaa40ab6c2ea8621343..c93f99c3ea5def11448c20f4fe9a07371f7a4dda 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/VolZmap.h b/VolZmap.h index 78a1d4d..529d700 100644 --- a/VolZmap.h +++ b/VolZmap.h @@ -72,9 +72,9 @@ class VolZmap : public IVolZmap, public IGeoObjRW public : // IVolZmap bool CopyFrom( const IGeoObj* pGObjSrc) override ; bool Clear( void) override ; - bool Create( const Point3d& ptO, double dDimX, double dDimY, double dDimZ, double dPrec, bool bTriDex) override ; - bool CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double dPrec, bool bTriDex) override ; - bool CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bTriDex) override ; + bool Create( const Point3d& ptO, double dDimX, double dDimY, double dDimZ, double dStep, bool bTriDex) override ; + bool CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double dStep, bool bTriDex) override ; + bool CreateFromTriMesh( const ISurfTriMesh& Surf, double dStep, bool bTriDex) override ; bool GetAllTriangles( TRIA3DEXLIST& lstTria) const override ; int GetBlockCount( void) const override ; bool GetVolume( double& dVol) const override ; diff --git a/VolZmapCreation.cpp b/VolZmapCreation.cpp index b2f2b21..d464e5f 100644 --- a/VolZmapCreation.cpp +++ b/VolZmapCreation.cpp @@ -26,14 +26,14 @@ using namespace std ; //---------------------------------------------------------------------------- bool -VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dLengthZ, double dPrec, bool bTriDex) +VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dLengthZ, double dStep, bool bTriDex) { // Controlli sull'ammissibilità delle dimensioni lineari del grezzo e del passo - if ( dPrec < EPS_SMALL || dLengthX < EPS_SMALL || dLengthY < EPS_SMALL || dLengthZ < EPS_SMALL) + if ( dStep < EPS_SMALL || dLengthX < EPS_SMALL || dLengthY < EPS_SMALL || dLengthZ < EPS_SMALL) return false ; // Il passo di discretizzazione non può essere inferiore a 100 * EPS_SMALL - m_dStep = max( dPrec, 100 * EPS_SMALL) ; + m_dStep = max( dStep, 100 * EPS_SMALL) ; // Aggiorno la dimensione della mappa 1 o 3 m_nMapNum = ( bTriDex ? 3 : 1) ; @@ -46,48 +46,38 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL m_MapFrame.Set( ptO, X_AX, Y_AX, Z_AX) ; // Definisco i vettori dei limiti su indici - m_nNx[0] = static_cast ( floor( ( dLengthX + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - m_nNy[0] = static_cast ( floor( ( dLengthY + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; + m_nNx[0] = unsigned int( ( dLengthX + EPS_SMALL) / m_dStep + 0.5) ; + m_nNy[0] = unsigned int( ( dLengthY + EPS_SMALL) / m_dStep + 0.5) ; // Calcolo il numero di voxel lungo X e Y unsigned int nVoxNumX = m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2) ; unsigned int nVoxNumY = m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2) ; // Definisco il numero di blocchi lungo x e y - m_nFracLin[0] = max( 1u, nVoxNumX / m_nVoxNumPerBlock + - ( nVoxNumX % m_nVoxNumPerBlock >= m_nVoxNumPerBlock / 2 ? 1 : 0)) ; - m_nFracLin[1] = max( 1u, nVoxNumY / m_nVoxNumPerBlock + - ( nVoxNumY % m_nVoxNumPerBlock >= m_nVoxNumPerBlock / 2 ? 1 : 0)) ; + m_nFracLin[0] = max( 1u, unsigned int( nVoxNumX * 1.0 / m_nVoxNumPerBlock + 0.7)) ; + m_nFracLin[1] = max( 1u, unsigned int( nVoxNumY * 1.0 / m_nVoxNumPerBlock + 0.7)) ; // Numero di componenti connesse m_nConnectedCompoCount = 1 ; // Se tridexel if ( bTriDex) { - - m_nNx[1] = static_cast ( floor( ( dLengthY + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - m_nNy[1] = static_cast ( floor( ( dLengthZ + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - - m_nNx[2] = static_cast ( floor( ( dLengthZ + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - m_nNy[2] = static_cast ( floor( ( dLengthX + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - + m_nNx[1] = m_nNy[0] ; + m_nNy[1] = unsigned int( ( dLengthZ + EPS_SMALL) / m_dStep + 0.5) ; + m_nNx[2] = m_nNy[1] ; + m_nNy[2] = m_nNx[0] ; // Calcolo il numero di voxel lungo Z unsigned int nVoxNumZ = m_nNy[1] / N_DEXVOXRATIO + ( m_nNy[1] % N_DEXVOXRATIO == 0 ? 1 : 2) ; - // Definisco il numero di blocchi lungo z - m_nFracLin[2] = max( 1u, nVoxNumZ / m_nVoxNumPerBlock + - ( nVoxNumZ % m_nVoxNumPerBlock >= m_nVoxNumPerBlock / 2 ? 1 : 0)) ; + m_nFracLin[2] = max( 1u, unsigned int( nVoxNumZ * 1.0 / m_nVoxNumPerBlock + 0.7)) ; } // altrimenti mono dexel else { - m_nNx[1] = 0 ; m_nNy[1] = 0 ; - m_nNx[2] = 0 ; m_nNy[2] = 0 ; - // Definisco il numero di blocchi lungo z m_nFracLin[2] = 1 ; } @@ -109,10 +99,8 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL // Aggiungo il tratto al dexel vuoto m_Values[i][j].resize( 1) ; - m_Values[i][j][0].dMin = 0 ; m_Values[i][j][0].nToolMin = 0 ; - m_Values[i][j][0].nCompo = 1 ; switch ( i) { @@ -147,9 +135,8 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL // Dimensiono e setto il vettore dei blocchi a da ricalcolare m_nNumBlock = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ; - m_BlockToUpdate.resize( m_nNumBlock) ; - for ( unsigned int nCount = 0 ; nCount < m_nNumBlock ; ++ nCount) - m_BlockToUpdate[nCount] = true ; + m_BlockToUpdate.clear() ; + m_BlockToUpdate.resize( m_nNumBlock, true) ; // Dimensiono raccolta di voxel, triangoli di feature tra blocchi e di segnalatori di materiale fra voxel m_InterBlockVox.resize( m_nNumBlock) ; @@ -166,13 +153,13 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL //---------------------------------------------------------------------------- bool -VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double dPrec, bool bTriDex) +VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double dStep, bool bTriDex) { // Aggiorno la dimensione della mappa 1 o 3 m_nMapNum = ( bTriDex ? 3 : 1) ; // Il passo di discretizzazione non può essere inferiore a 100 * EPS_SMALL - m_dStep = max( dPrec, 100 * EPS_SMALL) ; + m_dStep = max( dStep, 100 * EPS_SMALL) ; // Determino il bounding box della flat region BBox3d SurfBBox ; @@ -192,11 +179,9 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double // A partire dalle dimensioni di xy del grezzo determino il numero di colonne e righe // della griglia Zmap e da questi la dimensione del vettore di dexel - m_nNx[0] = static_cast ( floor( ( dLengthX + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - m_nNy[0] = static_cast ( floor( ( dLengthY + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - + m_nNx[0] = unsigned int( ( dLengthX + EPS_SMALL) / m_dStep + 0.5) ; + m_nNy[0] = unsigned int( ( dLengthY + EPS_SMALL) / m_dStep + 0.5) ; m_nDim[0] = m_nNx[0] * m_nNy[0] ; - // Ridimensiono il vettore di dexel e creo lo Zmap m_Values[0].resize( m_nDim[0]) ; @@ -205,50 +190,35 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double unsigned int nVoxNumY = m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2) ; // Definisco il numero di blocchi lungo x e y - m_nFracLin[0] = max( 1u, nVoxNumX / m_nVoxNumPerBlock + - ( nVoxNumX % m_nVoxNumPerBlock >= m_nVoxNumPerBlock / 2 ? 1 : 0)) ; - m_nFracLin[1] = max( 1u, nVoxNumY / m_nVoxNumPerBlock + - ( nVoxNumY % m_nVoxNumPerBlock >= m_nVoxNumPerBlock / 2 ? 1 : 0)) ; + m_nFracLin[0] = max( 1u, unsigned int( nVoxNumX * 1.0 / m_nVoxNumPerBlock + 0.7)) ; + m_nFracLin[1] = max( 1u, unsigned int( nVoxNumY * 1.0 / m_nVoxNumPerBlock + 0.7)) ; // Numero di componenti connesse m_nConnectedCompoCount = Surf.GetChunkCount() ; // Se Tridexel ridimensiono anche gli altri vettori if ( bTriDex) { - - m_nNx[1] = static_cast ( floor( ( dLengthY + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - m_nNy[1] = static_cast ( floor( ( dDimZ + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - - m_nNx[2] = static_cast ( floor( ( dDimZ + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - m_nNy[2] = static_cast ( floor( ( dLengthX + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - + m_nNx[1] = m_nNy[0] ; + m_nNy[1] = unsigned int( ( dDimZ + EPS_SMALL) / m_dStep + 0.5) ; m_nDim[1] = m_nNx[1] * m_nNy[1] ; - - m_nDim[2] = m_nNx[2] * m_nNy[2] ; - m_Values[1].resize( m_nDim[1]) ; + m_nNx[2] = m_nNy[1] ; + m_nNy[2] = m_nNx[0] ; + m_nDim[2] = m_nNx[2] * m_nNy[2] ; m_Values[2].resize( m_nDim[2]) ; - // Calcolo il numero di voxel lungo Z unsigned int nVoxNumZ = m_nNy[1] / N_DEXVOXRATIO + ( m_nNy[1] % N_DEXVOXRATIO == 0 ? 1 : 2) ; - // Definisco il numero di blocchi lungo z - m_nFracLin[2] = max( 1u, nVoxNumZ / m_nVoxNumPerBlock + - ( nVoxNumZ % m_nVoxNumPerBlock >= m_nVoxNumPerBlock / 2 ? 1 : 0)) ; + m_nFracLin[2] = max( 1u, unsigned int( nVoxNumZ * 1.0 / m_nVoxNumPerBlock + 0.7)) ; } else { - m_nNx[1] = 0 ; m_nNy[1] = 0 ; - m_nDim[1] = 0 ; - m_nNx[2] = 0 ; m_nNy[2] = 0 ; - m_nDim[2] = 0 ; - // Definisco il numero di blocchi lungo z m_nFracLin[2] = 1 ; } @@ -469,9 +439,8 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double // Dimensiono e setto il vettore dei blocchi a da ricalcolare m_nNumBlock = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ; - m_BlockToUpdate.resize( m_nNumBlock) ; - for ( unsigned int nCount = 0 ; nCount < m_nNumBlock ; ++ nCount) - m_BlockToUpdate[nCount] = true ; + m_BlockToUpdate.clear() ; + m_BlockToUpdate.resize( m_nNumBlock, true) ; // Dimensiono raccolta di voxel, triangoli di feature tra blocchi e di segnalatori di materiale fra voxel m_InterBlockVox.resize( m_nNumBlock) ; @@ -488,7 +457,7 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double //---------------------------------------------------------------------------- bool -VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bTriDex) +VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dStep, bool bTriDex) { // Se la superficie non è chiusa non ha senso continuare if ( ! Surf.IsClosed()) @@ -513,68 +482,51 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bTriDex m_MapFrame.Set( ptMapOrig, Frame3d::TOP) ; // Il passo di discretizzazione non può essere inferiore a 100 * EPS_SMALL - m_dStep = max( dPrec, 100 * EPS_SMALL) ; + m_dStep = max( dStep, 100 * EPS_SMALL) ; // Determino le dimensioni lineari del BBox Vector3d vtLen = ptMapEnd - ptMapOrig ; // A partire dalle dimensioni di xy del grezzo determino il numero di colonne e righe // della griglia Zmap e da questi la dimensione del vettore di dexel - m_nNx[0] = static_cast ( floor( ( vtLen.x + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - m_nNy[0] = static_cast ( floor( ( vtLen.y + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - + m_nNx[0] = unsigned int( ( vtLen.x + EPS_SMALL) / m_dStep + 0.5) ; + m_nNy[0] = unsigned int( ( vtLen.y + EPS_SMALL) / m_dStep + 0.5) ; m_nDim[0] = m_nNx[0] * m_nNy[0] ; - // Ridimensiono il vettore di dexel e creo lo Zmap m_Values[0].resize( m_nDim[0]) ; - // Calcolo il numero di voxel lungo X e Y unsigned int nVoxNumX = m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2) ; unsigned int nVoxNumY = m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2) ; - // Definisco il numero di blocchi lungo x e y - m_nFracLin[0] = max( 1u, nVoxNumX / m_nVoxNumPerBlock + - ( nVoxNumX % m_nVoxNumPerBlock >= m_nVoxNumPerBlock / 2 ? 1 : 0)) ; - m_nFracLin[1] = max( 1u, nVoxNumY / m_nVoxNumPerBlock + - ( nVoxNumY % m_nVoxNumPerBlock >= m_nVoxNumPerBlock / 2 ? 1 : 0)) ; + m_nFracLin[0] = max( 1u, unsigned int( nVoxNumX * 1.0 / m_nVoxNumPerBlock + 0.7)) ; + m_nFracLin[1] = max( 1u, unsigned int( nVoxNumY * 1.0 / m_nVoxNumPerBlock + 0.7)) ; - // Numero di componenti connesse + // Numero di componenti connesse da calcolare m_nConnectedCompoCount = - 1 ; // Se Tridexel ridimensiono anche gli altri vettori if ( bTriDex) { - - m_nNx[1] = static_cast ( floor( ( vtLen.y + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - m_nNy[1] = static_cast ( floor( ( vtLen.z + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - + m_nNx[1] = m_nNy[0] ; + m_nNy[1] = unsigned int( ( vtLen.z + EPS_SMALL) / m_dStep + 0.5) ; m_nDim[1] = m_nNx[1] * m_nNy[1] ; - - m_nNx[2] = static_cast ( floor( ( vtLen.z + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - m_nNy[2] = static_cast ( floor( ( vtLen.x + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - - m_nDim[2] = m_nNx[2] * m_nNy[2] ; - m_Values[1].resize( m_nDim[1]) ; + m_nNx[2] = m_nNy[1] ; + m_nNy[2] = m_nNx[0] ; + m_nDim[2] = m_nNx[2] * m_nNy[2] ; m_Values[2].resize( m_nDim[2]) ; - // Calcolo il numero di voxel lungo Z unsigned int nVoxNumZ = m_nNy[1] / N_DEXVOXRATIO + ( m_nNy[1] % N_DEXVOXRATIO == 0 ? 1 : 2) ; - // Definisco il numero di blocchi lungo z - m_nFracLin[2] = max( 1u, nVoxNumZ / m_nVoxNumPerBlock + - ( nVoxNumZ % m_nVoxNumPerBlock >= m_nVoxNumPerBlock / 2 ? 1 : 0)) ; + m_nFracLin[2] = max( 1u, unsigned int( nVoxNumZ * 1.0 / m_nVoxNumPerBlock + 0.7)) ; } else { - m_nNx[1] = 0 ; m_nNy[1] = 0 ; m_nDim[1] = 0 ; - m_nNx[2] = 0 ; m_nNy[2] = 0 ; m_nDim[2] = 0 ; - // Definisco il numero di blocchi lungo z m_nFracLin[2] = 1 ; } @@ -680,9 +632,8 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bTriDex // Dimensiono e setto il vettore dei blocchi a da ricalcolare m_nNumBlock = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ; - m_BlockToUpdate.resize( m_nNumBlock) ; - for ( unsigned int nCount = 0 ; nCount < m_nNumBlock ; ++ nCount) - m_BlockToUpdate[nCount] = true ; + m_BlockToUpdate.clear() ; + m_BlockToUpdate.resize( m_nNumBlock, true) ; // Dimensiono raccolta di voxel, triangoli di feature tra blocchi e di segnalatori di materiale fra voxel m_InterBlockVox.resize( m_nNumBlock) ; diff --git a/VolZmapGraphics.cpp b/VolZmapGraphics.cpp index 27b4db6..b132a50 100644 --- a/VolZmapGraphics.cpp +++ b/VolZmapGraphics.cpp @@ -22,12 +22,16 @@ #include "/EgtDev/Include/EGkIntervals.h" #include "/EgtDev/Include/EgtNumUtils.h" #include "/EgtDev/Include/EGkStringUtils3d.h" -#include "/EgtDev/Extern/Eigen\Core" -#include "/EgtDev/Extern/Eigen\SVD" +#include "/EgtDev/Extern/Eigen/Core" +#include "/EgtDev/Extern/Eigen/SVD" using namespace std ; -// ------------------------- UNORDERED MAP PER LA GESTIONE DEI TRIANGOLI GRANDI --------------------------------------------------- +// ------------------------- Tipi per SVD con Eigen ------------------------------------------------------------------------------ +static const int MAX_FAN_BASE_VERTS = 7 ; +typedef Eigen::Matrix SvdMatrix ; +typedef Eigen::Matrix SvdVector ; +typedef Eigen::JacobiSVD SvdDecomposer ; // ------------------------- TABELLA BLOCCHI ADIACENTI ---------------------------------------------------------------------------- static int NeighbourTable[8][4] = { @@ -59,13 +63,13 @@ TestOnNormal( const AppliedVector CompoField[], int nCompoElem) dMinCosTheta = dCurrCos ; nI = i ; nJ = j ; - } - } - } - + } + } + } + // Se la massima deviazione non supera il limite non è feature const double SHARP_COS_SUP = 0.866 ; - const double SHARP_COS_INF = - 0.985 ; // - 0.6 + const double SHARP_COS_INF = - 0.985 ; if ( dMinCosTheta >= SHARP_COS_SUP || dMinCosTheta <= SHARP_COS_INF) return NO_FEATURE ; @@ -145,10 +149,10 @@ DotTest( const AppliedVector CompoField[], int nCompoElem, Vector3d& vtAvg, doub double dCurrCos = CompoField[i].vtVec * CompoField[j].vtVec ; if ( dCurrCos < dMinCosTheta) { dMinCosTheta = dCurrCos ; - } - } - } - + } + } + } + // se normali sparpagliate oltre limite if ( dMinCosTheta < dThreshold) return false ; @@ -164,7 +168,7 @@ DotTest( const AppliedVector CompoField[], int nCompoElem, Vector3d& vtAvg, doub //---------------------------------------------------------------------------- bool -VolZmap::FindAdjComp( const std::vector& vVecVox, int nCurBlock, int nCurVox, int nCurComp, +VolZmap::FindAdjComp( const vector& vVecVox, int nCurBlock, int nCurVox, int nCurComp, INTVECTOR& vAdjBlockVoxComp, INTVECTOR& vAdjBordBlockVoxComp) const { // Controllo sulla validità del blocco @@ -183,7 +187,7 @@ VolZmap::FindAdjComp( const std::vector& vVecVox, int nCurBlock, GetVoxIJKFromN( nCurVox, nCurIJK[0], nCurIJK[1], nCurIJK[2]) ; bool bInnerVox = ! IsAVoxelOnBoundary( nLimits, nCurIJK, true) ; Voxel CurVox = bInnerVox ? ( * vVecVox[nCurBlock].find( nCurVox)).second : - ( * m_InterBlockVox[nCurBlock].find( nCurVox)).second ; + ( * m_InterBlockVox[nCurBlock].find( nCurVox)).second ; // Ciclo su tutti i voxel adiacenti for ( int nI = - 1 ; nI <= 1 ; ++ nI) { for ( int nJ = - 1 ; nJ <= 1 ; ++ nJ) { @@ -192,12 +196,12 @@ VolZmap::FindAdjComp( const std::vector& vVecVox, int nCurBlock, if ( nI == 0 && nJ == 0 && nK == 0) continue ; // Indici del voxel adiacente - int nAdjVoxIJK[3] = { nCurIJK[0] + nI, nCurIJK[1] + nJ, nCurIJK[2] + nK} ; + int nAdjVoxIJK[3] = { nCurIJK[0] + nI, nCurIJK[1] + nJ, nCurIJK[2] + nK} ; // Risalgo all'indice del voxel adiacente (chiave) a partire dagli indici ijk int nAdjVoxInd ; - if ( GetVoxNFromIJK( nAdjVoxIJK[0], nAdjVoxIJK[1], nAdjVoxIJK[2], nAdjVoxInd)) { + if ( GetVoxNFromIJK( nAdjVoxIJK[0], nAdjVoxIJK[1], nAdjVoxIJK[2], nAdjVoxInd)) { // Risalgo al blocco del voxel adiacente - int nAdjBlockIJK[3] ; + int nAdjBlockIJK[3] ; // Se tale blocco esiste if ( GetVoxelBlockIJK( nAdjVoxIJK, nAdjBlockIJK)) { // Risalgo all'indice del blocco adiacente dai suoi indici ijk @@ -205,7 +209,7 @@ VolZmap::FindAdjComp( const std::vector& vVecVox, int nCurBlock, GetBlockNFromIJK( nAdjBlockIJK, nAdjBlockInd) ; // Se tale blocco è stato aggiornato, il voxel adiacente contiene componenti feature ed è interno if ( m_BlockToUpdate[nAdjBlockInd] && - vVecVox[nAdjBlockInd].find( nAdjVoxInd) != vVecVox[nAdjBlockInd].end()) { + vVecVox[nAdjBlockInd].find( nAdjVoxInd) != vVecVox[nAdjBlockInd].end()) { // Accedo al voxel adiacente Voxel AdjVox = ( * vVecVox[nAdjBlockInd].find( nAdjVoxInd)).second ; // Valuto la connessione fra le componenti dei due voxels @@ -222,18 +226,18 @@ VolZmap::FindAdjComp( const std::vector& vVecVox, int nCurBlock, if ( AreSamePointExact( ptV, ptAdVN) &&/*||*/ AreSamePointExact( ptVN, ptAdV)) { bConnected = true ; break ; - } + } } if ( bConnected) break ; } - if ( bConnected) { - vAdjBlockVoxComp.emplace_back( nAdjBlockInd) ; + if ( bConnected) { + vAdjBlockVoxComp.emplace_back( nAdjBlockInd) ; vAdjBlockVoxComp.emplace_back( nAdjVoxInd) ; vAdjBlockVoxComp.emplace_back( nAdjComp) ; } - } - } + } + } // A prescindere dal fatto che il blocco sia stato aggiornato, // se il voxel è di frontiera lo analizzo. if ( m_InterBlockVox[nAdjBlockInd].find( nAdjVoxInd) != m_InterBlockVox[nAdjBlockInd].end()) { @@ -253,23 +257,23 @@ VolZmap::FindAdjComp( const std::vector& vVecVox, int nCurBlock, if ( AreSamePointExact( ptV, ptAdVN) &&/*||*/ AreSamePointExact( ptVN, ptAdV)) { bConnected = true ; break ; - } + } } if ( bConnected) break ; } - if ( bConnected) { - vAdjBordBlockVoxComp.emplace_back( nAdjBlockInd) ; + if ( bConnected) { + vAdjBordBlockVoxComp.emplace_back( nAdjBlockInd) ; vAdjBordBlockVoxComp.emplace_back( nAdjVoxInd) ; vAdjBordBlockVoxComp.emplace_back( nAdjComp) ; } - } + } } - } + } } } - } - } + } + } return true ; } @@ -449,44 +453,43 @@ VolZmap::GetTriangles( bool bAllBlocks, INTVECTOR& nModifiedBlocks, TRIA3DEXLIST nModifiedBlocks.resize( m_nNumBlock + 1) ; vLstTria.reserve( m_nNumBlock + 1) ; - //std::vector> VoxMatrix ; - std::vector vVoxContainerVec ; - vVoxContainerVec.resize( m_nNumBlock) ; + vector vVoxContainerVec ; + vVoxContainerVec.resize( m_nNumBlock) ; TriaMatrix VecTriHold ; VecTriHold.resize( m_nNumBlock) ; // Ciclo sui blocchi per eliminare le slice fra blocchi da aggiornare for ( size_t t = 0 ; t < m_nNumBlock ; ++ t) { for ( auto it = m_SliceXY[t].begin() ; it != m_SliceXY[t].end() ;) { - int nSlIJK[3] ; - if ( GetVoxIJKFromN( it->first, nSlIJK[0], nSlIJK[1], nSlIJK[2])) { + int nSlIJK[3] ; + if ( GetVoxIJKFromN( it->first, nSlIJK[0], nSlIJK[1], nSlIJK[2])) { int nBlockIJK[3] ; - if ( GetVoxelBlockIJK( nSlIJK, nBlockIJK)) { - int nLimits[6] ; + if ( GetVoxelBlockIJK( nSlIJK, nBlockIJK)) { + int nLimits[6] ; int nDeltaIndex[3] ; - if ( GetBlockLimitsIJK( nBlockIJK, nLimits) && + if ( GetBlockLimitsIJK( nBlockIJK, nLimits) && IsAVoxelOnBoundary( nLimits, nSlIJK, nDeltaIndex)) { for ( int nInd = 0 ; nInd < 3 ; ++ nInd) - nSlIJK[nInd] += nDeltaIndex[nInd] ; + nSlIJK[nInd] += nDeltaIndex[nInd] ; int nAdBlockIJK[3] ; int nAdBlockNum ; if ( GetVoxelBlockIJK( nSlIJK, nAdBlockIJK) && GetBlockNFromIJK( nAdBlockIJK, nAdBlockNum) && m_BlockToUpdate[nAdBlockNum]) { it = m_SliceXY[t].erase( it) ; - continue ; - } - } - } + continue ; + } + } + } } ++ it ; } for ( auto it = m_SliceXZ[t].begin() ; it != m_SliceXZ[t].end() ;) { - int nSlIJK[3] ; - if ( GetVoxIJKFromN( it->first, nSlIJK[0], nSlIJK[1], nSlIJK[2])) { + int nSlIJK[3] ; + if ( GetVoxIJKFromN( it->first, nSlIJK[0], nSlIJK[1], nSlIJK[2])) { int nBlockIJK[3] ; if ( GetVoxelBlockIJK( nSlIJK, nBlockIJK)) { - int nLimits[6] ; + int nLimits[6] ; int nDeltaIndex[3] ; if ( GetBlockLimitsIJK( nBlockIJK, nLimits) && IsAVoxelOnBoundary( nLimits, nSlIJK, nDeltaIndex)) { @@ -497,20 +500,20 @@ VolZmap::GetTriangles( bool bAllBlocks, INTVECTOR& nModifiedBlocks, TRIA3DEXLIST if ( GetVoxelBlockIJK( nSlIJK, nAdBlockIJK) && GetBlockNFromIJK( nAdBlockIJK, nAdBlockNum) && m_BlockToUpdate[nAdBlockNum]) { - it = m_SliceXZ[t].erase( it) ; + it = m_SliceXZ[t].erase( it) ; continue ; - } - } - } + } + } + } } ++ it ; - } + } for ( auto it = m_SliceYZ[t].begin() ; it != m_SliceYZ[t].end() ;) { - int nSlIJK[3] ; - if ( GetVoxIJKFromN( it->first, nSlIJK[0], nSlIJK[1], nSlIJK[2])) { + int nSlIJK[3] ; + if ( GetVoxIJKFromN( it->first, nSlIJK[0], nSlIJK[1], nSlIJK[2])) { int nBlockIJK[3] ; if ( GetVoxelBlockIJK( nSlIJK, nBlockIJK)) { - int nLimits[6] ; + int nLimits[6] ; int nDeltaIndex[3] ; if ( GetBlockLimitsIJK( nBlockIJK, nLimits) && IsAVoxelOnBoundary( nLimits, nSlIJK, nDeltaIndex)) { @@ -523,24 +526,24 @@ VolZmap::GetTriangles( bool bAllBlocks, INTVECTOR& nModifiedBlocks, TRIA3DEXLIST m_BlockToUpdate[nAdBlockNum]) { it = m_SliceYZ[t].erase( it) ; continue ; - } - } - } + } + } + } } ++ it ; - } + } } bool bCalcInterBlock = false ; - + // Calcolo i triangoli sui blocchi for ( size_t t = 0 ; t < m_nNumBlock ; ++ t) { // Se il blocco deve essere processato if ( bAllBlocks || m_BlockToUpdate[t]) { // processo ... vLstTria.emplace_back() ; - nModifiedBlocks[t] = int( vLstTria.size()) - 1 ; - ExtMarchingCubes( int( t), vLstTria.back(), vVoxContainerVec[t]) ; + nModifiedBlocks[t] = int( vLstTria.size()) - 1 ; + ExtMarchingCubes( int( t), vLstTria.back(), vVoxContainerVec[t]) ; } else nModifiedBlocks[t] = -1 ; @@ -589,7 +592,7 @@ VolZmap::GetTriangles( bool bAllBlocks, INTVECTOR& nModifiedBlocks, TRIA3DEXLIST if ( bNormN && bNormV && vtN * vtNV < 0.7) VecTriHold[t][t1].vCompoTria[t2][t3].SetVertexNorm( nV, vtN) ; } - // aggiungo triangolo alla lista + // aggiungo triangolo alla lista vLstTria[nModifiedBlocks[t]].emplace_back( VecTriHold[t][t1].vCompoTria[t2][t3]) ; } } @@ -903,7 +906,7 @@ VolZmap::ProcessCube( int nVoxI, int nVoxJ, int nVoxK, TRIA3DEXLIST& lstTria, Vo AppliedVector CompoVert[4][7] ; AppliedVector CompoTriVert[4][17] ; - // Arrey numero di vertici della base del fan per componente + // Array numero di vertici della base del fan per componente // connessa: nVertComp[i] contiene il numero di vertici // della base del fan della (i+1)-esima componente connessa. int nVertComp[4] ; @@ -1129,12 +1132,8 @@ VolZmap::ProcessCube( int nVoxI, int nVoxJ, int nVoxK, TRIA3DEXLIST& lstTria, Vo vtTrasf[ni] = CompoVert[nComp][ni].ptPApp - ptGravityCenter ; // Preparo le matrici per il sistema - typedef Eigen::Matrix dSystemMatrix ; - typedef Eigen::Matrix dSystemVector ; - typedef Eigen::JacobiSVD DecomposerSVD ; - - dSystemMatrix dMatrixN( nVertComp[nComp], 3) ; - dSystemVector dKnownVector( nVertComp[nComp], 1) ; + SvdMatrix dMatrixN( nVertComp[nComp], 3) ; + SvdVector dKnownVector( nVertComp[nComp]) ; // medio le normali adiacenti molto vicine (delta angolare inferiore a 22.5 deg) Vector3d vtNorm[12] ; @@ -1162,9 +1161,9 @@ VolZmap::ProcessCube( int nVoxI, int nVoxJ, int nVoxK, TRIA3DEXLIST& lstTria, Vo } // calcolo SVD - DecomposerSVD svd( dMatrixN, Eigen::ComputeThinU | Eigen::ComputeThinV) ; - dSystemMatrix dMatrixV = svd.matrixV() ; - dSystemVector dSingularValue = svd.singularValues() ; + SvdDecomposer svd( dMatrixN, Eigen::ComputeThinU | Eigen::ComputeThinV) ; + auto dMatrixV = svd.matrixV() ; + auto dSingularValue = svd.singularValues() ; // Se la feature è un edge annullo il valore singolare minore. if ( nFeatureType == EDGE) { @@ -1173,8 +1172,7 @@ VolZmap::ProcessCube( int nVoxI, int nVoxJ, int nVoxK, TRIA3DEXLIST& lstTria, Vo } // risolvo il sistema con SVD, quindi ai minimi quadrati - dSystemVector dUnknownVector( 3, 1) ; - dUnknownVector = svd.solve( dKnownVector) ; + auto dUnknownVector = svd.solve( dKnownVector) ; // Vettore Baricentro-Feature Vector3d vtFeature( dUnknownVector( 0), dUnknownVector( 1), dUnknownVector( 2)) ; // Esprimo la soluzione nel sistema di riferimento z-map @@ -1187,7 +1185,6 @@ VolZmap::ProcessCube( int nVoxI, int nVoxJ, int nVoxK, TRIA3DEXLIST& lstTria, Vo Vector3d vtBaseVert = CompoVert[nComp][ni].ptPApp - ptSol ; Vector3d vtDist = vtBaseVert - vtBaseVert * vtNullSpace * vtNullSpace ; double dMaxDist = 0.005 * N_DEXVOXRATIO * m_dStep ; - double bau = vtDist.Len() ; if ( vtDist.SqLen() < dMaxDist * dMaxDist) { ptSol = CompoVert[nComp][ni].ptPApp ; break ; @@ -1205,6 +1202,7 @@ VolZmap::ProcessCube( int nVoxI, int nVoxJ, int nVoxK, TRIA3DEXLIST& lstTria, Vo CurrVox.Compo[tOldCompo].bInside = IsPointInsideVoxelApprox( nVoxI, nVoxJ, nVoxK, ptSol, EPS_SMALL) ; CurrVox.Compo[tOldCompo].bCorner = ( nFeatureType == CORNER) ; } + // Standard MC else { vector vTria ; @@ -1384,9 +1382,9 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV // Riempio il nCompCount-esimo vettore di vertici dei triangoli in assenza di // sharp feature: in una mesh di triangoli con n vertici vi sono n - 2 triangoli. for ( int nVert = 0 ; nVert < 3 * ( nVertComp[nComp] - 2) ; nVert += 3) { - CompoTriVert[nComp][nVert] = VecField[TriangleTableEn[nIndex][0][nStdTabOff + nVert+2]] ; - CompoTriVert[nComp][nVert+1] = VecField[TriangleTableEn[nIndex][0][nStdTabOff + nVert+1]] ; - CompoTriVert[nComp][nVert+2] = VecField[TriangleTableEn[nIndex][0][nStdTabOff + nVert]] ; + CompoTriVert[nComp][nVert] = VecField[TriangleTableEn[nIndex][0][nStdTabOff + nVert + 2]] ; + CompoTriVert[nComp][nVert+1] = VecField[TriangleTableEn[nIndex][0][nStdTabOff + nVert + 1]] ; + CompoTriVert[nComp][nVert+2] = VecField[TriangleTableEn[nIndex][0][nStdTabOff + nVert]] ; } // Aggiorno gli offsets per raggiungere i vertici della componente successiva. @@ -1459,100 +1457,100 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV while ( nIndexConfig3[nCount] != nIndex) ++ nCount ; // Vedo se la topologia è definita: se sì uso l'informazione - // passata dall'altro voxel, altrimenti la calcolo + // passata dall'altro voxel, altrimenti la calcolo int nIJKSl[3] = { ( nAdjVox3[nCount] != 1 ? i : i + 1), ( nAdjVox3[nCount] != 2 ? j : j + 1), ( nAdjVox3[nCount] != 3 ? k : k + 1)} ; int nSliceN ; int nSlBlockN ; - if ( GetVoxNFromIJK( nIJKSl[0], nIJKSl[1], nIJKSl[2], nSliceN)) { + if ( GetVoxNFromIJK( nIJKSl[0], nIJKSl[1], nIJKSl[2], nSliceN)) { int nSlBlockIJK[3] ; - GetVoxelBlockIJK( nIJKSl, nSlBlockIJK) ; + GetVoxelBlockIJK( nIJKSl, nSlBlockIJK) ; if ( abs( nAdjVox3[nCount]) == 1) { - auto it = SliceYZ.find( nSliceN) ; + auto it = SliceYZ.find( nSliceN) ; if ( it != SliceYZ.end()) { bNewTopology = it->second ; bDefTopology = true ; - } - if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { + } + if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { auto it = m_SliceYZ[nSlBlockN].find( nSliceN) ; if ( it != m_SliceYZ[nSlBlockN].end()) { bNewTopology = it->second ; bDefTopology = true ; - } - } - } + } + } + } else if ( abs( nAdjVox3[nCount]) == 2) { - auto it = SliceXZ.find( nSliceN) ; + auto it = SliceXZ.find( nSliceN) ; if ( it != SliceXZ.end()) { bNewTopology = it->second ; bDefTopology = true ; - } - if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { + } + if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { auto it = m_SliceXZ[nSlBlockN].find( nSliceN); if ( it != m_SliceXZ[nSlBlockN].end()) { bNewTopology = it->second ; bDefTopology = true ; - } + } } - } + } else if ( abs( nAdjVox3[nCount]) == 3) { - auto it = SliceXY.find( nSliceN) ; + auto it = SliceXY.find( nSliceN) ; if ( it != SliceXY.end()) { bNewTopology = it->second ; bDefTopology = true ; - } - if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { + } + if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { auto it = m_SliceXY[nSlBlockN].find( nSliceN) ; if ( it != m_SliceXY[nSlBlockN].end()) { bNewTopology = it->second ; bDefTopology = true ; - } + } } - } + } } - // La topologia è indefinita: calcolo la topologia + // La topologia è indefinita: calcolo la topologia if ( ! bDefTopology && bReg) { double dDotSum = 0 ; for ( int nFV = 0 ; nFV < 3 ; ++ nFV) { for ( int nTV = 0 ; nTV < 2 ; ++ nTV) { - dDotSum += CompoVert[0][nFV].vtVec * CompoVert[1][nTV].vtVec ; + dDotSum += CompoVert[0][nFV].vtVec * CompoVert[1][nTV].vtVec ; } } for ( int nFVI = 0 ; nFVI < 2 ; ++ nFVI) { for ( int nFVJ = nFVI + 1 ; nFVJ < 3 ; ++ nFVJ) { - dDotSum -= CompoVert[0][nFVI].vtVec * CompoVert[0][nFVJ].vtVec ; + dDotSum -= CompoVert[0][nFVI].vtVec * CompoVert[0][nFVJ].vtVec ; } } for ( int nTVI = 0 ; nTVI < 2 ; ++ nTVI) { for ( int nTVJ = nTVI + 1 ; nTVJ < 3 ; ++ nTVJ) { - dDotSum -= CompoVert[1][nTVI].vtVec * CompoVert[1][nTVJ].vtVec ; + dDotSum -= CompoVert[1][nTVI].vtVec * CompoVert[1][nTVJ].vtVec ; } - } + } bNewTopology = dDotSum > - EPS_SMALL ; - } - // Conservo l'informazione per i voxel successivi + } + // Conservo l'informazione per i voxel successivi if ( GetVoxNFromIJK( nIJKSl[0], nIJKSl[1], nIJKSl[2], nSliceN)) { if ( abs(nAdjVox3[nCount]) == 1) { if ( nSlBlockN == nBlock) SliceYZ.emplace( nSliceN, ! bNewTopology) ; else m_SliceYZ[nSlBlockN].emplace( nSliceN, ! bNewTopology) ; - } + } else if ( abs(nAdjVox3[nCount]) == 2) { if ( nSlBlockN == nBlock) SliceXZ.emplace( nSliceN, ! bNewTopology) ; else - m_SliceXZ[nSlBlockN].emplace( nSliceN, ! bNewTopology) ; + m_SliceXZ[nSlBlockN].emplace( nSliceN, ! bNewTopology) ; } else if (abs(nAdjVox3[nCount]) == 3) { if ( nSlBlockN == nBlock) SliceXY.emplace( nSliceN, ! bNewTopology) ; else m_SliceXY[nSlBlockN].emplace( nSliceN, ! bNewTopology) ; - } + } } - + // Si passa alla seconda topologia if ( bNewTopology) { // Ricerca del caso corrispondente della nuova topologia @@ -1582,7 +1580,7 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV nExtTabOff += nVertComp[nC - 1] ; nStdTabOff += 3 * ( nVertComp[nC - 1] - 2) ; } - } + } } // Configurazione 6 @@ -1593,8 +1591,8 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV int nCount = 0 ; while ( nIndexConfig6[nCount] != nIndex) ++ nCount ; - // Vedo se la topologia è definita: se sì uso l'informazione già posseduta, - // altrimenti devo calcolare la topologia + // Vedo se la topologia è definita: se sì uso l'informazione già posseduta, + // altrimenti devo calcolare la topologia int nIJKSl[3] = { ( nAdjVox6[nCount] != 1 ? i : i + 1), ( nAdjVox6[nCount] != 2 ? j : j + 1), ( nAdjVox6[nCount] != 3 ? k : k + 1)} ; @@ -1602,93 +1600,93 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV int nSlBlockN ; if ( GetVoxNFromIJK( nIJKSl[0], nIJKSl[1], nIJKSl[2], nSliceN)) { int nSlBlockIJK[3] ; - GetVoxelBlockIJK( nIJKSl, nSlBlockIJK) ; + GetVoxelBlockIJK( nIJKSl, nSlBlockIJK) ; if ( abs( nAdjVox6[nCount]) == 1) { - auto it = SliceYZ.find( nSliceN) ; + auto it = SliceYZ.find( nSliceN) ; if ( it != SliceYZ.end()) { bNewTopology = it->second ; bDefTopology = true ; } - if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { + if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { auto it = m_SliceYZ[nSlBlockN].find( nSliceN) ; if ( it != m_SliceYZ[nSlBlockN].end()) { bNewTopology = it->second ; bDefTopology = true ; - } - } - } + } + } + } else if ( abs( nAdjVox6[nCount]) == 2) { - auto it = SliceXZ.find( nSliceN) ; + auto it = SliceXZ.find( nSliceN) ; if ( it != SliceXZ.end()) { bNewTopology = it->second ; bDefTopology = true ; } - if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { + if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { auto it = m_SliceXZ[nSlBlockN].find( nSliceN) ; if ( it != m_SliceXZ[nSlBlockN].end()) { bNewTopology = it->second ; bDefTopology = true ; - } - } - } + } + } + } else if ( abs( nAdjVox6[nCount]) == 3) { - auto it = SliceXY.find( nSliceN) ; + auto it = SliceXY.find( nSliceN) ; if ( it != SliceXY.end()) { bNewTopology = it->second ; bDefTopology = true ; } - if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { + if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { auto it = m_SliceXY[nSlBlockN].find( nSliceN) ; if ( it != m_SliceXY[nSlBlockN].end()) { - bNewTopology = it->second ; + bNewTopology = it->second ; bDefTopology = true ; - } - } - } - } + } + } + } + } // Topologia indefinita: la calcolo if ( ! bDefTopology && bReg) { // Test sulla topologia double dDotSum = 0 ; for ( int nFV = 0 ; nFV < 4 ; ++ nFV) { for ( int nTV = 0 ; nTV < 3 ; ++ nTV) { - dDotSum += CompoVert[0][nFV].vtVec * CompoVert[1][nTV].vtVec ; + dDotSum += CompoVert[0][nFV].vtVec * CompoVert[1][nTV].vtVec ; } } for ( int nFVI = 0 ; nFVI < 3 ; ++ nFVI) { for ( int nFVJ = nFVI + 1 ; nFVJ < 4 ; ++ nFVJ) { - dDotSum -= CompoVert[0][nFVI].vtVec * CompoVert[0][nFVJ].vtVec ; + dDotSum -= CompoVert[0][nFVI].vtVec * CompoVert[0][nFVJ].vtVec ; } } for ( int nTVI = 0 ; nTVI < 2 ; ++ nTVI) { for ( int nTVJ = nTVI + 1 ; nTVJ < 3 ; ++ nTVJ) { - dDotSum -= CompoVert[1][nTVI].vtVec * CompoVert[1][nTVJ].vtVec ; + dDotSum -= CompoVert[1][nTVI].vtVec * CompoVert[1][nTVJ].vtVec ; } } bNewTopology = dDotSum > - 4 ; - } - // Conservo l'informazione + } + // Conservo l'informazione if ( GetVoxNFromIJK( nIJKSl[0], nIJKSl[1], nIJKSl[2], nSliceN)) { if ( abs(nAdjVox6[nCount]) == 1) { if ( nSlBlockN == nBlock) SliceYZ.emplace( nSliceN, ! bNewTopology) ; else m_SliceYZ[nSlBlockN].emplace( nSliceN, ! bNewTopology) ; - } + } else if ( abs(nAdjVox6[nCount]) == 2) { if ( nSlBlockN == nBlock) SliceXZ.emplace( nSliceN, ! bNewTopology) ; else - m_SliceXZ[nSlBlockN].emplace( nSliceN, ! bNewTopology) ; + m_SliceXZ[nSlBlockN].emplace( nSliceN, ! bNewTopology) ; } else if (abs(nAdjVox6[nCount]) == 3) { if ( nSlBlockN == nBlock) SliceXY.emplace( nSliceN, ! bNewTopology) ; else m_SliceXY[nSlBlockN].emplace( nSliceN, ! bNewTopology) ; - } + } } - + // Si deve passare alla seconda topologia if ( bNewTopology) { // Ricerca del caso corrispondente della nuova topologia @@ -1696,7 +1694,7 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV while ( nIndexVsIndex6[nt][0] != nIndex) ++ nt ; int nRotCase = nIndexVsIndex6[nt][1] ; - + // Aggiorno numero di componenti nComponents = Cases6Plus[nRotCase][1][0] ; // Riaggiorno gli offsets @@ -1709,8 +1707,8 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV // Matrice dei vertici della base del fan for ( int nFanVert = 0 ; nFanVert < nVertComp[nC - 1] ; ++ nFanVert) CompoVert[nC - 1][nFanVert] = VecField[Cases6Plus[nRotCase][1][nFanVert + nExtTabOff + 1]] ; - // Matrici dei vertici dei triangoli in assenza di sharp feature - for ( int nTriVert = 0 ; nTriVert < 3 * ( nVertComp[nC - 1] - 2) ; nTriVert += 3) { + // Matrici dei vertici dei triangoli in assenza di sharp feature + for ( int nTriVert = 0 ; nTriVert < 3 * ( nVertComp[nC - 1] - 2) ; nTriVert += 3) { CompoTriVert[nC - 1][nTriVert] = VecField[Cases6Plus[nRotCase][0][nStdTabOff + nTriVert+2]] ; CompoTriVert[nC - 1][nTriVert+1] = VecField[Cases6Plus[nRotCase][0][nStdTabOff + nTriVert+1]] ; CompoTriVert[nC - 1][nTriVert+2] = VecField[Cases6Plus[nRotCase][0][nStdTabOff + nTriVert]] ; @@ -1730,9 +1728,9 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV int nCount = 0 ; while ( nIndexConfig10[nCount] != nIndex) ++ nCount ; - // Vedo se la topologia è definita: se sì uso l'informazione già posseduta, - // altrimenti devo calcolare la topologia - int nIJKSlSt[3] = { i, j, k} ; + // Vedo se la topologia è definita: se sì uso l'informazione già posseduta, + // altrimenti devo calcolare la topologia + int nIJKSlSt[3] = { i, j, k} ; int nIJKSlEn[3] = { ( nAdjVox10[nCount] != 1 ? i : i + 1), ( nAdjVox10[nCount] != 2 ? j : j + 1), ( nAdjVox10[nCount] != 3 ? k : k + 1)} ; @@ -1741,77 +1739,77 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV if ( GetVoxNFromIJK( nIJKSlSt[0], nIJKSlSt[1], nIJKSlSt[2], nSliceStN) && GetVoxNFromIJK( nIJKSlEn[0], nIJKSlEn[1], nIJKSlEn[2], nSliceEnN)) { if ( abs( nAdjVox10[nCount]) == 1) { - auto itSt = SliceYZ.find( nSliceStN) ; + auto itSt = SliceYZ.find( nSliceStN) ; if ( itSt != SliceYZ.end()) { bNewTopology = itSt->second ; bDefStTopology = true ; - } + } } else if ( abs( nAdjVox10[nCount]) == 2) { - auto itSt = SliceXZ.find( nSliceStN) ; + auto itSt = SliceXZ.find( nSliceStN) ; if ( itSt != SliceXZ.end()) { bNewTopology = itSt->second ; bDefStTopology = true ; - } + } } else if ( abs( nAdjVox10[nCount]) == 3) { auto itSt = SliceXY.find( nSliceStN) ; if ( itSt != SliceXY.end()) { bNewTopology = itSt->second ; bDefStTopology = true ; - } + } } - } - // La topologia non è definita, la calcolo + } + // La topologia non è definita, la calcolo if ( ! bDefStTopology && bReg) { // Verifico concordanza tra i versori di una stessa componente // (ogni coppia di vettori di una medesima componente deve avere prodotto scalare non inferiore a 0.0) - Vector3d vtCmpAvg0, vtCmpAvg1 ; + Vector3d vtCmpAvg0, vtCmpAvg1 ; bool bTest0 = DotTest( CompoVert[0], 4, vtCmpAvg0, 0.0) ; bool bTest1 = DotTest( CompoVert[1], 4, vtCmpAvg1, 0.0) ; bNewTopology = ( ! bTest0 || ! bTest1) ; - } - // Conservo l'informazioe e la trasmetto al voxel successivo + } + // Conservo l'informazioe e la trasmetto al voxel successivo if ( GetVoxNFromIJK( nIJKSlSt[0], nIJKSlSt[1], nIJKSlSt[2], nSliceStN) && GetVoxNFromIJK( nIJKSlEn[0], nIJKSlEn[1], nIJKSlEn[2], nSliceEnN)) { if ( abs( nAdjVox6[nCount]) == 1) { - if ( GetBlockNFromIJK( nIJKSlEn, nSlBlockEnN)) { + if ( GetBlockNFromIJK( nIJKSlEn, nSlBlockEnN)) { auto it = m_SliceYZ[nSlBlockEnN].find( nSliceEnN) ; if ( it != m_SliceYZ[nSlBlockEnN].end()) { if ( it->second != bNewTopology) - m_BlockToUpdate[nSlBlockEnN] = true ; - it->second = bNewTopology ; - } - else - m_SliceYZ[nSlBlockEnN].emplace( nSliceEnN, bNewTopology) ; - } - } + m_BlockToUpdate[nSlBlockEnN] = true ; + it->second = bNewTopology ; + } + else + m_SliceYZ[nSlBlockEnN].emplace( nSliceEnN, bNewTopology) ; + } + } else if ( abs( nAdjVox6[nCount]) == 2) { - if ( GetBlockNFromIJK( nIJKSlEn, nSlBlockEnN)) { + if ( GetBlockNFromIJK( nIJKSlEn, nSlBlockEnN)) { auto it = m_SliceXZ[nSlBlockEnN].find( nSliceEnN) ; if ( it != m_SliceXZ[nSlBlockEnN].end()) { if ( it->second != bNewTopology) - m_BlockToUpdate[nSlBlockEnN] = true ; - it->second = bNewTopology ; - } - else - m_SliceXZ[nSlBlockEnN].emplace( nSliceEnN, bNewTopology) ; - } - } + m_BlockToUpdate[nSlBlockEnN] = true ; + it->second = bNewTopology ; + } + else + m_SliceXZ[nSlBlockEnN].emplace( nSliceEnN, bNewTopology) ; + } + } else if ( abs( nAdjVox6[nCount]) == 3) { - if ( GetBlockNFromIJK( nIJKSlEn, nSlBlockEnN)) { + if ( GetBlockNFromIJK( nIJKSlEn, nSlBlockEnN)) { auto it = m_SliceXY[nSlBlockEnN].find( nSliceEnN) ; if ( it != m_SliceXY[nSlBlockEnN].end()) { if ( it->second != bNewTopology) - m_BlockToUpdate[nSlBlockEnN] = true ; - it->second = bNewTopology ; - } - else - m_SliceXY[nSlBlockEnN].emplace( nSliceEnN, bNewTopology) ; - } - } + m_BlockToUpdate[nSlBlockEnN] = true ; + it->second = bNewTopology ; + } + else + m_SliceXY[nSlBlockEnN].emplace( nSliceEnN, bNewTopology) ; + } + } } - + // Si passa alla seconda topologia if ( bNewTopology) { // Ricerca del caso corrispondente della nuova topologia @@ -1839,9 +1837,9 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV nExtTabOff += nVertComp[nC - 1] ; nStdTabOff += 3 * ( nVertComp[nC - 1] - 2) ; } - } + } } - + Voxel VoxConf ; VoxConf.nNumComp = 0 ; @@ -1870,12 +1868,8 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV vtTrasf[ni] = CompoVert[nComp][ni].ptPApp - ptGravityCenter ; // Preparo le matrici per il sistema - typedef Eigen::Matrix dSystemMatrix ; - typedef Eigen::Matrix dSystemVector ; - typedef Eigen::JacobiSVD DecomposerSVD ; - - dSystemMatrix dMatrixN( nVertComp[nComp], 3) ; - dSystemVector dKnownVector( nVertComp[nComp], 1) ; + SvdMatrix dMatrixN( nVertComp[nComp], 3) ; + SvdVector dKnownVector( nVertComp[nComp]) ; // medio le normali adiacenti molto vicine (delta angolare inferiore a 22.5 deg) Vector3d vtNorm[12] ; @@ -1903,9 +1897,9 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV } // calcolo SVD - DecomposerSVD svd( dMatrixN, Eigen::ComputeThinU | Eigen::ComputeThinV) ; - dSystemMatrix dMatrixV = svd.matrixV() ; - dSystemVector dSingularValue = svd.singularValues() ; + SvdDecomposer svd( dMatrixN, Eigen::ComputeThinU | Eigen::ComputeThinV) ; + auto dMatrixV = svd.matrixV() ; + auto dSingularValue = svd.singularValues() ; // Se la feature è un edge annullo il valore singolare minore. if ( nFeatureType == EDGE) { @@ -1914,8 +1908,7 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV } // risolvo il sistema con SVD, quindi ai minimi quadrati - dSystemVector dUnknownVector( 3, 1) ; - dUnknownVector = svd.solve( dKnownVector) ; + auto dUnknownVector = svd.solve( dKnownVector) ; // Vettore Baricentro-Feature Vector3d vtFeature( dUnknownVector( 0), dUnknownVector( 1), dUnknownVector( 2)) ; // Esprimo la soluzione nel sistema di riferimento z-map @@ -1927,23 +1920,22 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV Vector3d vtBaseVert = CompoVert[nComp][ni].ptPApp - ptSol ; Vector3d vtDist = vtBaseVert - vtBaseVert * vtNullSpace * vtNullSpace ; double dMaxDist = 0.005 * N_DEXVOXRATIO * m_dStep ; - double bau = vtDist.Len() ; if ( vtDist.SqLen() < dMaxDist * dMaxDist) { ptSol = CompoVert[nComp][ni].ptPApp ; break ; - } - } + } + } } - - size_t tOldCompo = VoxConf.nNumComp ; + + size_t tOldCompo = VoxConf.nNumComp ; ++ VoxConf.nNumComp ; VoxConf.Compo[tOldCompo].nVertNum = nVertComp[nComp] ; for ( int nV = 0 ; nV < nVertComp[nComp] ; ++ nV) { - VoxConf.Compo[tOldCompo].CompVecField[nV] = CompoVert[nComp][nV] ; - } + VoxConf.Compo[tOldCompo].CompVecField[nV] = CompoVert[nComp][nV] ; + } VoxConf.Compo[tOldCompo].ptVert = ptSol ; VoxConf.Compo[tOldCompo].bInside = IsPointInsideVoxelApprox( i, j, k, ptSol, EPS_SMALL) ; - VoxConf.Compo[tOldCompo].bCorner = ( nFeatureType == CORNER) ; + VoxConf.Compo[tOldCompo].bCorner = ( nFeatureType == CORNER) ; } // Standard MC else { @@ -1972,7 +1964,7 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV else CurrentTriangle.SetVertexNorm( nV, CurrentTriangle.GetN()) ; } - } + } // Riporto le coordinate nel sistema in cui è immerso lo Zmap CurrentTriangle.ToGlob( m_MapFrame) ; // Aggiungo alla lista @@ -1985,14 +1977,14 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV vTria[0].SetGrade( -1) ; vTria[1].SetGrade( -1) ; } - else if ( vTria[0].GetGrade() > 0 || vTria[1].GetGrade() > 0) { + else if ( vTria[0].GetGrade() > 0 || vTria[1].GetGrade() > 0) { vTria[0].SetGrade( 1) ; vTria[1].SetGrade( 1) ; - } + } } for ( int nT = 0 ; nT < int( vTria.size()) ; ++ nT) lstTria.emplace_back( vTria[nT]) ; - } + } } // Se nel voxel abbiamo trovato feature // aggiorniamo i contenitori. @@ -2003,15 +1995,15 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV int nIJK[3] = { i, j, k} ; int nKey ; GetVoxNFromIJK( i, j, k, nKey) ; - if ( IsAVoxelOnBoundary( nLimits, nIJK, true)) - m_InterBlockVox[nBlock].emplace( nKey, VoxConf) ; - else - vVox.emplace( nKey, VoxConf) ; + if ( IsAVoxelOnBoundary( nLimits, nIJK, true)) + m_InterBlockVox[nBlock].emplace( nKey, VoxConf) ; + else + vVox.emplace( nKey, VoxConf) ; } } } } - + // Processo i Voxel con possibile superficie piana ProcessVoxContXY( VoxContXYInf, false, lstTria) ; ProcessVoxContXY( VoxContXYSup, true, lstTria) ; @@ -2025,25 +2017,25 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV //---------------------------------------------------------------------------- bool -VolZmap::RegulateFeaturesChain( std::vector& vVecVox) const +VolZmap::RegulateFeaturesChain( vector& vVecVox) const { // Ciclo sui blocchi - for ( int nBlock = 0 ; nBlock < int( m_nNumBlock) ; ++ nBlock) { + for ( int nBlock = 0 ; nBlock < int( m_nNumBlock) ; ++ nBlock) { // Se il blocco è da aggiornare if ( m_BlockToUpdate[nBlock]) { // Ciclo sui voxel interni for ( auto itVox = vVecVox[nBlock].begin() ; itVox != vVecVox[nBlock].end() ; ++ itVox) { int nVox ; - Voxel& CurVox = itVox->second ; - GetVoxNFromIJK( CurVox.i, CurVox.j, CurVox.k, nVox) ; + Voxel& CurVox = itVox->second ; + GetVoxNFromIJK( CurVox.i, CurVox.j, CurVox.k, nVox) ; // Ciclo sulle componenti - for ( int nComp = 0 ; nComp < CurVox.nNumComp ; ++ nComp) { + for ( int nComp = 0 ; nComp < CurVox.nNumComp ; ++ nComp) { // Vertice fuori dal suo voxel if ( ! CurVox.Compo[nComp].bInside) { // Caso corner if ( CurVox.Compo[nComp].bCorner) { // Cerco i primi vicini - std::vector vNearFirst, vBordNearFirst ; + INTVECTOR vNearFirst, vBordNearFirst ; FindAdjComp( vVecVox, nBlock, nVox, nComp, vNearFirst, vBordNearFirst) ; // Ciclo sui primi vicini int nInnSizeF = int( vNearFirst.size()) ; @@ -2051,49 +2043,49 @@ VolZmap::RegulateFeaturesChain( std::vector& vVecVox) const for ( int nF = 0 ; nF < nInnSizeF + nBorSizeF ; nF += 3) { // Indice e vettore corrente dei primi vicini int nFCur = nF < nInnSizeF ? nF : nF - nInnSizeF ; - std::vector vVecNFCur = nF < nInnSizeF ? vNearFirst : vBordNearFirst ; + INTVECTOR vVecNFCur = nF < nInnSizeF ? vNearFirst : vBordNearFirst ; // Cerco i secondi vicini - std::vector vNearSecond, vBordNearSecond ; + INTVECTOR vNearSecond, vBordNearSecond ; FindAdjComp( vVecVox, vVecNFCur[nFCur], vVecNFCur[nFCur+1], vVecNFCur[nFCur+2], - vNearSecond, vBordNearSecond) ; + vNearSecond, vBordNearSecond) ; // Ciclo sui secondi vicini int nInnSizeS = int( vNearSecond.size()) ; int nBorSizeS = int( vBordNearSecond.size()) ; for ( int nS = 0 ; nS < nInnSizeS + nBorSizeS ; nS += 3) { // Indice e vettore corrente dei secondi vicini int nNSCur = nS < nInnSizeS ? nS : nS - nInnSizeS ; - std::vector vVecNSCur = nS < nInnSizeS ? vNearSecond : vBordNearSecond ; + INTVECTOR vVecNSCur = nS < nInnSizeS ? vNearSecond : vBordNearSecond ; // Escludo dai secondi i primi vicini bool bFirst = false ; if ( vVecNSCur[nNSCur] == nBlock && vVecNSCur[nNSCur+1] == nVox && vVecNSCur[nNSCur+2] == nComp) - bFirst = true ; - for ( int nOldF = 0 ; nOldF < nInnSizeF + nBorSizeF ; nOldF += 3) { + bFirst = true ; + for ( int nOldF = 0 ; nOldF < nInnSizeF + nBorSizeF ; nOldF += 3) { if ( nOldF < nInnSizeF) { - if ( vVecNSCur[nNSCur] == vNearFirst[nOldF] && - vVecNSCur[nNSCur+1] == vNearFirst[nOldF+1] && + if ( vVecNSCur[nNSCur] == vNearFirst[nOldF] && + vVecNSCur[nNSCur+1] == vNearFirst[nOldF+1] && vVecNSCur[nNSCur+2] == vNearFirst[nOldF+2]) bFirst = true ; } else { - if ( vVecNSCur[nNSCur] == vBordNearFirst[nOldF-nInnSizeF] && - vVecNSCur[nNSCur+1] == vBordNearFirst[nOldF-nInnSizeF+1] && + if ( vVecNSCur[nNSCur] == vBordNearFirst[nOldF-nInnSizeF] && + vVecNSCur[nNSCur+1] == vBordNearFirst[nOldF-nInnSizeF+1] && vVecNSCur[nNSCur+2] == vBordNearFirst[nOldF-nInnSizeF+2]) - bFirst = true ; - } + bFirst = true ; + } } // Se trovo un secondo fra i primi salto l'iterazione if ( bFirst) continue ; // Se necessario regolarizzo la catena - Voxel& VoxNearFirst = nF < nInnSizeF ? vVecVox[vVecNFCur[nFCur]].find( vVecNFCur[nFCur+1])->second : + Voxel& VoxNearFirst = nF < nInnSizeF ? vVecVox[vVecNFCur[nFCur]].find( vVecNFCur[nFCur+1])->second : m_InterBlockVox[vVecNFCur[nFCur]].find( vVecNFCur[nFCur+1])->second ; - Voxel& VoxNearSecond = nS < nInnSizeS ? vVecVox[vVecNSCur[nNSCur]].find( vVecNSCur[nNSCur+1])->second : - m_InterBlockVox[vVecNSCur[nNSCur]].find( vVecNSCur[nNSCur+1])->second ; - Point3d ptCurV = CurVox.Compo[nComp].ptVert ; - Point3d ptFirst = VoxNearFirst.Compo[vVecNFCur[nFCur+2]].ptVert ; - Point3d ptSecond = VoxNearSecond.Compo[vVecNSCur[nNSCur+2]].ptVert ; + Voxel& VoxNearSecond = nS < nInnSizeS ? vVecVox[vVecNSCur[nNSCur]].find( vVecNSCur[nNSCur+1])->second : + m_InterBlockVox[vVecNSCur[nNSCur]].find( vVecNSCur[nNSCur+1])->second ; + Point3d ptCurV = CurVox.Compo[nComp].ptVert ; + Point3d ptFirst = VoxNearFirst.Compo[vVecNFCur[nFCur+2]].ptVert ; + Point3d ptSecond = VoxNearSecond.Compo[vVecNSCur[nNSCur+2]].ptVert ; Vector3d vtF = ptFirst - ptCurV ; Vector3d vtS = ptSecond - ptCurV ; vtF.Normalize() ; @@ -2119,7 +2111,7 @@ VolZmap::RegulateFeaturesChain( std::vector& vVecVox) const vtBarSF.Normalize() ; if ( vtBarCF * vtBarCS > 0.5 && vtBarCF * vtBarSF > 0.5 && vtBarCS * vtBarSF > 0.5 && vtF * vtS < - 0.9 && ! VoxNearFirst.Compo[vVecNFCur[nFCur+2]].bCorner) { - VoxNearFirst.Compo[vVecNFCur[nFCur+2]].ptVert = 0.5 * ( ptCurV + ptSecond) ; + VoxNearFirst.Compo[vVecNFCur[nFCur+2]].ptVert = 0.5 * ( ptCurV + ptSecond) ; } } } @@ -2130,20 +2122,20 @@ VolZmap::RegulateFeaturesChain( std::vector& vVecVox) const FindAdjComp( vVecVox, nBlock, nVox, nComp, vNearInn, vNearBord) ; int nSizeInn = int( vNearInn.size()) ; int nSizeBord = int( vNearBord.size() ); - if ( nSizeInn + nSizeBord == 6) { - const Voxel* pVoxSt = nullptr ; + if ( nSizeInn + nSizeBord == 6) { + const Voxel* pVoxSt = nullptr ; const Voxel* pVoxEn = nullptr ; if ( nSizeInn == 6) { - pVoxSt = &( vVecVox[vNearInn[0]].find( vNearInn[1])->second) ; - pVoxEn = &( vVecVox[vNearInn[3]].find( vNearInn[4])->second) ; + pVoxSt = &( vVecVox[vNearInn[0]].find( vNearInn[1])->second) ; + pVoxEn = &( vVecVox[vNearInn[3]].find( vNearInn[4])->second) ; } else if ( nSizeBord == 6) { - pVoxSt = &( m_InterBlockVox[vNearBord[0]].find( vNearBord[1])->second) ; - pVoxEn = &( m_InterBlockVox[vNearBord[3]].find( vNearBord[4])->second) ; + pVoxSt = &( m_InterBlockVox[vNearBord[0]].find( vNearBord[1])->second) ; + pVoxEn = &( m_InterBlockVox[vNearBord[3]].find( vNearBord[4])->second) ; } else { pVoxSt = &( vVecVox[vNearInn[0]].find( vNearInn[1])->second) ; - pVoxEn = &( m_InterBlockVox[vNearBord[0]].find( vNearBord[1])->second) ; + pVoxEn = &( m_InterBlockVox[vNearBord[0]].find( vNearBord[1])->second) ; } Point3d ptPCur = CurVox.Compo[nComp].ptVert ; Point3d ptPSt ; @@ -2168,8 +2160,8 @@ VolZmap::RegulateFeaturesChain( std::vector& vVecVox) const vtCurrEn.Normalize() ; Point3d ptMid = 0.5 * ( ptPSt + ptPEn) ; double dMidU = ( ptMid - ptPSt) * vtStEn ; - double dCurU = ( ptPCur - ptPSt) * vtStEn ; - Point3d ptNew ; + double dCurU = ( ptPCur - ptPSt) * vtStEn ; + Point3d ptNew ; Point3d ptPLine ; Vector3d vtDLine ; if ( dMidU < dCurU) { @@ -2180,7 +2172,7 @@ VolZmap::RegulateFeaturesChain( std::vector& vVecVox) const else { ptPLine = ptPSt ; vtDLine = vtStCurr ; - ptNew = ptPSt + ( ptMid - ptPSt) * vtStCurr * vtStCurr ; + ptNew = ptPSt + ( ptMid - ptPSt) * vtStCurr * vtStCurr ; } Point3d ptCubeInf( ( CurVox.i * N_DEXVOXRATIO + 0.5) * m_dStep, ( CurVox.j * N_DEXVOXRATIO + 0.5) * m_dStep, @@ -2191,13 +2183,13 @@ VolZmap::RegulateFeaturesChain( std::vector& vVecVox) const double dU1, dU2 ; if ( 1 - abs( vtStCurr * vtCurrEn ) < EPS_ZERO && IntersLineBox( ptPLine, vtDLine, ptCubeInf, ptCubeSup, dU1, dU2)) { - double dU = abs( dU1) < abs( dU2) ? dU1 + ( dU2 - dU1) / 2 : dU2 + ( dU1 - dU2) / 2 ; + double dU = abs( dU1) < abs( dU2) ? dU1 + ( dU2 - dU1) / 2 : dU2 + ( dU1 - dU2) / 2 ; ptNew = ptPLine + dU * vtDLine ; } bool bNewInside = IsPointInsideVoxelApprox( CurVox.i, CurVox.j, CurVox.k, ptNew, 0) ; if ( abs( vtStCurr * vtStEn) > 0.95 && abs( vtStCurr * vtCurrEn) > 0.95 && abs( vtStEn * vtCurrEn) > 0.95) { - CurVox.Compo[nComp].ptVert = ptNew ; + CurVox.Compo[nComp].ptVert = ptNew ; } } } @@ -2207,47 +2199,47 @@ VolZmap::RegulateFeaturesChain( std::vector& vVecVox) const // Ciclo sui voxel di frontiera for ( auto itVox = m_InterBlockVox[nBlock].begin() ; itVox != m_InterBlockVox[nBlock].end() ; ++ itVox) { int nVox ; - Voxel& CurVox = itVox->second ; - GetVoxNFromIJK( CurVox.i, CurVox.j, CurVox.k, nVox) ; + Voxel& CurVox = itVox->second ; + GetVoxNFromIJK( CurVox.i, CurVox.j, CurVox.k, nVox) ; // Ciclo sulle componenti for ( int nComp = 0 ; nComp < CurVox.nNumComp ; ++ nComp) { // Vertice fuori dal suo voxel if ( ! CurVox.Compo[nComp].bInside) { // Caso feature if ( ! CurVox.Compo[nComp].bCorner) { - std::vector vNearInn, vNearBord ; + INTVECTOR vNearInn, vNearBord ; FindAdjComp( vVecVox, nBlock, nVox, nComp, vNearInn, vNearBord) ; int nSizeInn = int( vNearInn.size()) ; int nSizeBord = int( vNearBord.size() ); - if ( nSizeInn + nSizeBord == 6) { + if ( nSizeInn + nSizeBord == 6) { const Voxel* pVoxSt = nullptr ; const Voxel* pVoxEn = nullptr ; if ( nSizeInn == 6) { - pVoxSt = &( vVecVox[vNearInn[0]].find( vNearInn[1])->second) ; - pVoxEn = &( vVecVox[vNearInn[3]].find( vNearInn[4])->second) ; + pVoxSt = &( vVecVox[vNearInn[0]].find( vNearInn[1])->second) ; + pVoxEn = &( vVecVox[vNearInn[3]].find( vNearInn[4])->second) ; } else if ( nSizeBord == 6) { - pVoxSt = &( m_InterBlockVox[vNearBord[0]].find( vNearBord[1])->second) ; - pVoxEn = &( m_InterBlockVox[vNearBord[3]].find( vNearBord[4])->second) ; + pVoxSt = &( m_InterBlockVox[vNearBord[0]].find( vNearBord[1])->second) ; + pVoxEn = &( m_InterBlockVox[vNearBord[3]].find( vNearBord[4])->second) ; } else { pVoxSt = &( vVecVox[vNearInn[0]].find( vNearInn[1])->second) ; - pVoxEn = &( m_InterBlockVox[vNearBord[0]].find( vNearBord[1])->second) ; + pVoxEn = &( m_InterBlockVox[vNearBord[0]].find( vNearBord[1])->second) ; } Point3d ptPCur = CurVox.Compo[nComp].ptVert ; Point3d ptPSt ; Point3d ptPEn ; if ( nSizeInn == 6) { ptPSt = pVoxSt->Compo[vNearInn[2]].ptVert ; - ptPEn = pVoxEn->Compo[vNearInn[5]].ptVert ; + ptPEn = pVoxEn->Compo[vNearInn[5]].ptVert ; } else if ( nSizeBord == 6) { ptPSt = pVoxSt->Compo[vNearBord[2]].ptVert ; - ptPEn = pVoxEn->Compo[vNearBord[5]].ptVert ; + ptPEn = pVoxEn->Compo[vNearBord[5]].ptVert ; } else { ptPSt = pVoxSt->Compo[vNearInn[2]].ptVert ; - ptPEn = pVoxEn->Compo[vNearBord[2]].ptVert ; + ptPEn = pVoxEn->Compo[vNearBord[2]].ptVert ; } Vector3d vtStCurr = ptPCur - ptPSt ; Vector3d vtStEn = ptPEn - ptPSt ; @@ -2255,10 +2247,10 @@ VolZmap::RegulateFeaturesChain( std::vector& vVecVox) const vtStCurr.Normalize() ; vtStEn.Normalize() ; vtCurrEn.Normalize() ; - Point3d ptMid = 0.5 * ( ptPSt + ptPEn) ; + Point3d ptMid = 0.5 * ( ptPSt + ptPEn) ; double dMidU = ( ptMid - ptPSt) * vtStEn ; - double dCurU = ( ptPCur - ptPSt) * vtStEn ; - Point3d ptNew ; + double dCurU = ( ptPCur - ptPSt) * vtStEn ; + Point3d ptNew ; Point3d ptPLine ; Vector3d vtDLine ; if ( dMidU < dCurU) { @@ -2269,7 +2261,7 @@ VolZmap::RegulateFeaturesChain( std::vector& vVecVox) const else { ptPLine = ptPSt ; vtDLine = vtStCurr ; - ptNew = ptPSt + ( ptMid - ptPSt) * vtStCurr * vtStCurr ; + ptNew = ptPSt + ( ptMid - ptPSt) * vtStCurr * vtStCurr ; } Point3d ptCubeInf( ( CurVox.i * N_DEXVOXRATIO + 0.5) * m_dStep, ( CurVox.j * N_DEXVOXRATIO + 0.5) * m_dStep, @@ -2280,21 +2272,21 @@ VolZmap::RegulateFeaturesChain( std::vector& vVecVox) const double dU1, dU2 ; if ( 1 - abs( vtStCurr * vtCurrEn ) < EPS_ZERO && IntersLineBox( ptPLine, vtDLine, ptCubeInf, ptCubeSup, dU1, dU2)) { - double dU = abs( dU1) < abs( dU2) ? dU1 + ( dU2 - dU1) / 2 : dU2 + ( dU1 - dU2) / 2 ; + double dU = abs( dU1) < abs( dU2) ? dU1 + ( dU2 - dU1) / 2 : dU2 + ( dU1 - dU2) / 2 ; ptNew = ptPLine + dU * vtDLine ; } bool bNewInside = IsPointInsideVoxelApprox( CurVox.i, CurVox.j, CurVox.k, ptNew, 0) ; if ( abs( vtStCurr * vtStEn) > 0.95 && abs( vtStCurr * vtCurrEn) > 0.95 && abs( vtStEn * vtCurrEn) > 0.95 /*&& bNewInside*/) { - CurVox.Compo[nComp].ptVert = ptNew ; + CurVox.Compo[nComp].ptVert = ptNew ; } } } } - } + } } - } - } + } + } return true ; } @@ -2319,14 +2311,14 @@ VolZmap::CreateSharpFeatureTriangle( int nBlock, const VoxelContainer& vVoxel, T triHold.resize( tOldSize + 1) ; triHold[tOldSize].i = it->second.i ; triHold[tOldSize].j = it->second.j ; - triHold[tOldSize].k = it->second.k ; + triHold[tOldSize].k = it->second.k ; // Ciclo sulle componenti connesse del voxel - for ( int nComp = 0 ; nComp < it->second.nNumComp ; ++ nComp) { + for ( int nComp = 0 ; nComp < it->second.nNumComp ; ++ nComp) { triHold[tOldSize].ptCompoVert.emplace_back( it->second.Compo[nComp].ptVert) ; triHold[tOldSize].ptCompoVert.back().ToGlob( m_MapFrame) ; - size_t tOldCompNum = triHold[tOldSize].vCompoTria.size() ; + size_t tOldCompNum = triHold[tOldSize].vCompoTria.size() ; triHold[tOldSize].vCompoTria.resize( tOldCompNum + 1) ; - triHold[tOldSize].vbFlipped.resize( tOldCompNum + 1) ; + triHold[tOldSize].vbFlipped.resize( tOldCompNum + 1) ; // ciclo sui vertici della componente connessa int nNumVert = it->second.Compo[nComp].nVertNum ; for ( int nVert = 0 ; nVert < nNumVert ; ++ nVert) { @@ -2355,13 +2347,13 @@ VolZmap::CreateSharpFeatureTriangle( int nBlock, const VoxelContainer& vVoxel, T CurrTri.SetVertexNorm( 0, 0.5 * ( CurrTri.GetVertexNorm( 1) + CurrTri.GetVertexNorm( 2))) ; // Valido il triangolo - CurrTri.Validate( true) ; + CurrTri.Validate( true) ; triHold[tOldSize].vCompoTria[tOldCompNum].emplace_back( CurrTri) ; triHold[tOldSize].vCompoTria[tOldCompNum].back().ToGlob( m_MapFrame) ; size_t tTri = triHold[tOldSize].vbFlipped[tOldCompNum].size() ; triHold[tOldSize].vbFlipped[tOldCompNum].resize( tTri + 1) ; - triHold[tOldSize].vbFlipped[tOldCompNum][tTri] = false ; - } + triHold[tOldSize].vbFlipped[tOldCompNum][tTri] = false ; + } } } @@ -2377,17 +2369,17 @@ VolZmap::CreateSharpFeatureTriangle( int nBlock, const VoxelContainer& vVoxel, T // Ridimensiono il contenitore dei triangoli interni int nOldSizeInn = int( triHold.size()) ; triHold.resize( nOldSizeInn + 1) ; - triHold[nOldSizeInn].i = nVoxIJK[0] ; + triHold[nOldSizeInn].i = nVoxIJK[0] ; triHold[nOldSizeInn].j = nVoxIJK[1] ; - triHold[nOldSizeInn].k = nVoxIJK[2] ; + triHold[nOldSizeInn].k = nVoxIJK[2] ; // Ridimensiono il contenitore dei triangoli di frontiera - int nOldSizeBor = int( m_InterBlockTria[nBlock].size()) ; + int nOldSizeBor = int( m_InterBlockTria[nBlock].size()) ; m_InterBlockTria[nBlock].resize( nOldSizeBor + 1) ; m_InterBlockTria[nBlock][nOldSizeBor].i = nVoxIJK[0] ; m_InterBlockTria[nBlock][nOldSizeBor].j = nVoxIJK[1] ; - m_InterBlockTria[nBlock][nOldSizeBor].k = nVoxIJK[2] ; + m_InterBlockTria[nBlock][nOldSizeBor].k = nVoxIJK[2] ; // Ciclo sulle componenti connesse del voxel - for ( int nComp = 0 ; nComp < itVox->second.nNumComp ; ++ nComp) { + for ( int nComp = 0 ; nComp < itVox->second.nNumComp ; ++ nComp) { bool bNewCompInn = true ; bool bNewCompBor = true ; // ciclo sui vertici della componente connessa @@ -2438,7 +2430,7 @@ VolZmap::CreateSharpFeatureTriangle( int nBlock, const VoxelContainer& vVoxel, T m_InterBlockTria[nBlock][nOldSizeBor].vCompoTria[tCurrSz - 1].back().ToGlob( m_MapFrame) ; size_t tTri = m_InterBlockTria[nBlock][nOldSizeBor].vbFlipped[tCurrSz - 1].size() ; m_InterBlockTria[nBlock][nOldSizeBor].vbFlipped[tCurrSz - 1].resize( tTri + 1) ; - m_InterBlockTria[nBlock][nOldSizeBor].vbFlipped[tCurrSz - 1][tTri] = false ; + m_InterBlockTria[nBlock][nOldSizeBor].vbFlipped[tCurrSz - 1][tTri] = false ; } // Triangolo interno else { @@ -2446,7 +2438,7 @@ VolZmap::CreateSharpFeatureTriangle( int nBlock, const VoxelContainer& vVoxel, T Point3d ptVert = itVox->second.Compo[nComp].ptVert ; ptVert.ToGlob( m_MapFrame) ; triHold[nOldSizeInn].ptCompoVert.emplace_back( ptVert) ; - size_t tOldComp = triHold[nOldSizeInn].vCompoTria.size() ; + size_t tOldComp = triHold[nOldSizeInn].vCompoTria.size() ; triHold[nOldSizeInn].vCompoTria.resize( tOldComp + 1) ; triHold[nOldSizeInn].vbFlipped.resize( tOldComp + 1) ; bNewCompInn = false ; @@ -2457,11 +2449,11 @@ VolZmap::CreateSharpFeatureTriangle( int nBlock, const VoxelContainer& vVoxel, T size_t tTri = triHold[nOldSizeInn].vbFlipped[tCurrSz - 1].size() ; triHold[nOldSizeInn].vbFlipped[tCurrSz - 1].resize( tTri + 1) ; triHold[nOldSizeInn].vbFlipped[tCurrSz - 1][tTri] = false ; - } - } + } + } } } - + return true ; } @@ -2475,14 +2467,14 @@ VolZmap::CreateSharpFeatureTriangle( const VoxelContainer& vVoxel, TriHolder& tr triHold.resize( tOldSize + 1) ; triHold[tOldSize].i = it->second.i ; triHold[tOldSize].j = it->second.j ; - triHold[tOldSize].k = it->second.k ; + triHold[tOldSize].k = it->second.k ; // Ciclo sulle componenti connesse del voxel for ( int nComp = 0 ; nComp < it->second.nNumComp ; ++ nComp) { triHold[tOldSize].ptCompoVert.emplace_back( it->second.Compo[nComp].ptVert) ; // triHold[tOldSize].ptCompoVert.back().ToGlob( m_MapFrame) ; - size_t tOldCompNum = triHold[tOldSize].vCompoTria.size() ; + size_t tOldCompNum = triHold[tOldSize].vCompoTria.size() ; triHold[tOldSize].vCompoTria.resize( tOldCompNum + 1) ; - triHold[tOldSize].vbFlipped.resize( tOldCompNum + 1) ; + triHold[tOldSize].vbFlipped.resize( tOldCompNum + 1) ; // ciclo sui vertici della componente connessa int nNumVert = it->second.Compo[nComp].nVertNum ; for ( int nVert = 0 ; nVert < nNumVert ; ++ nVert) { @@ -2511,16 +2503,16 @@ VolZmap::CreateSharpFeatureTriangle( const VoxelContainer& vVoxel, TriHolder& tr CurrTri.SetVertexNorm( 0, 0.5 * ( CurrTri.GetVertexNorm( 1) + CurrTri.GetVertexNorm( 2))) ; // Valido il triangolo - CurrTri.Validate( true) ; + CurrTri.Validate( true) ; triHold[tOldSize].vCompoTria[tOldCompNum].emplace_back( CurrTri) ; //triHold[tOldSize].vCompoTria[tOldCompNum].back().ToGlob( m_MapFrame) ; size_t tTri = triHold[tOldSize].vbFlipped[tOldCompNum].size() ; triHold[tOldSize].vbFlipped[tOldCompNum].resize( tTri + 1) ; - triHold[tOldSize].vbFlipped[tOldCompNum][tTri] = false ; - } + triHold[tOldSize].vbFlipped[tOldCompNum][tTri] = false ; + } } } - + return true ; } @@ -2591,7 +2583,7 @@ VolZmap::ExtMarchingCubes( vector& vVox, TRIA3DEXLIST& lstTria, bo for ( int nVox = 0 ; nVox < int( triHold.size()) ; ++ nVox) { for ( int nCompo = 0 ; nCompo < int( triHold[nVox].vCompoTria.size()) ; ++ nCompo) { for ( int nTri = 0 ; nTri < int( triHold[nVox].vCompoTria[nCompo].size()) ; ++ nTri) { - lstTria.emplace_back( triHold[nVox].vCompoTria[nCompo][nTri]) ; + lstTria.emplace_back( triHold[nVox].vCompoTria[nCompo][nTri]) ; } } } @@ -2693,8 +2685,8 @@ VolZmap::FlipEdgesII( TriHolder& TriHold) const TriHold[n2].vbFlipped[nCompo2][nTri2] = true ; // Valido i triangoli TriHold[n1].vCompoTria[nCompo1][nTri1].Validate( true) ; - TriHold[n2].vCompoTria[nCompo2][nTri2].Validate( true) ; - // Avvenuto flipping + TriHold[n2].vCompoTria[nCompo2][nTri2].Validate( true) ; + // Avvenuto flipping bModified = true ; break ; } @@ -2706,9 +2698,9 @@ VolZmap::FlipEdgesII( TriHolder& TriHold) const dDotVec[0] = TriHold[n1].vCompoTria[nCompo1][nTri1].GetN() * TriHold[n1].vCompoTria[nCompo1][nTri1].GetVertexNorm( 1) ; dDotVec[1] = TriHold[n2].vCompoTria[nCompo2][nTri2].GetN() * - TriHold[n2].vCompoTria[nCompo2][nTri2].GetVertexNorm( 2) ; + TriHold[n2].vCompoTria[nCompo2][nTri2].GetVertexNorm( 2) ; dDotVec[2] = TriHold[n1].vCompoTria[nCompo1][nTri1].GetN() * - TriHold[n1].vCompoTria[nCompo1][nTri1].GetVertexNorm( 2) ; + TriHold[n1].vCompoTria[nCompo1][nTri1].GetVertexNorm( 2) ; dDotVec[3] = TriHold[n2].vCompoTria[nCompo2][nTri2].GetN() * TriHold[n2].vCompoTria[nCompo2][nTri2].GetVertexNorm( 1) ; // Cerco il massimo dei prodotti scalari @@ -2718,7 +2710,7 @@ VolZmap::FlipEdgesII( TriHolder& TriHold) const if ( dDotVec[nPos] > dMaxDot) { dMaxDot = dDotVec[nPos] ; nMaxPos = nPos ; - } + } } // Trovo il colore associato al vertice di massimo prodotto scalare int nCol ; @@ -2738,10 +2730,10 @@ VolZmap::FlipEdgesII( TriHolder& TriHold) const } // Assegno il colore ai triangoli TriHold[n1].vCompoTria[nCompo1][nTri1].SetGrade( nCol) ; - TriHold[n2].vCompoTria[nCompo2][nTri2].SetGrade( nCol) ; + TriHold[n2].vCompoTria[nCompo2][nTri2].SetGrade( nCol) ; } - } - } + } + } if ( bModified) break ; } @@ -2769,7 +2761,7 @@ VolZmap::FlipEdgesBB( TriaMatrix& InterTria) const // Se i blocchi non sono adiacenti salto l'iterazione if ( ! ( abs( nFBijk[0] - nLBijk[0]) <= 1 && abs( nFBijk[1] - nLBijk[1]) <= 1 && - abs( nFBijk[2] - nLBijk[2]) <= 1)) + abs( nFBijk[2] - nLBijk[2]) <= 1)) continue ; // Numero di voxel nei blocchi correnti size_t nVoxelNumFB = InterTria[tFB].size() ; @@ -2874,7 +2866,7 @@ VolZmap::FlipEdgesBB( TriaMatrix& InterTria) const dDotVec[1] = InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].GetN() * InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].GetVertexNorm( 2) ; dDotVec[2] = InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].GetN() * - InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].GetVertexNorm( 2) ; + InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].GetVertexNorm( 2) ; dDotVec[3] = InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].GetN() * InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].GetVertexNorm( 1) ; // Cerco il massimo dei prodotti scalari @@ -2882,9 +2874,9 @@ VolZmap::FlipEdgesBB( TriaMatrix& InterTria) const double dMaxDot = - 1 ; for ( int nPos = 0 ; nPos < 4 && dMaxDot < 1 ; ++ nPos) { if ( dDotVec[nPos] > dMaxDot) { - dMaxDot = dDotVec[nPos] ; + dMaxDot = dDotVec[nPos] ; nMaxPos = nPos ; - } + } } // Trovo il colore associato al vertice di massimo prodotto scalare int nCol ; @@ -2904,7 +2896,7 @@ VolZmap::FlipEdgesBB( TriaMatrix& InterTria) const } // Assegno il colore ai triangoli InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].SetGrade( nCol) ; - InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].SetGrade( nCol) ; + InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].SetGrade( nCol) ; } } } @@ -3231,8 +3223,7 @@ VolZmap::GetVoxNFromIJK( int nI, int nJ, int nK, int& nN) const return false ; // Calcolo il numero di Voxel - nN = nVoxNumX * nVoxNumY * ( nK + 1) + - nVoxNumX * ( nJ + 1) + nI + 1 ; + nN = nVoxNumX * nVoxNumY * ( nK + 1) + nVoxNumX * ( nJ + 1) + nI + 1 ; // controllo sulla sensatezza del numero ottenuto return ( nN >= 0 && nN < nVoxNumX * nVoxNumY * nVoxNumZ) ; @@ -3531,10 +3522,11 @@ VolZmap::IsATriangleOnBorder( const Triangle3dEx& trTria, const Point3d& ptVert, bool VolZmap::ProcessVoxContXY( FlatVoxelContainer& VoxContXY, bool bPlus, TRIA3DEXLIST& lstTria) const { - FlatVoxelContainer::iterator it = VoxContXY.begin() ; - while ( it != VoxContXY.end()) { + for ( auto it = VoxContXY.begin() ; + it != VoxContXY.end() ; + it = VoxContXY.begin()) { - int nN = ( *it).first ; + int nN = it->first ; int nI, nJ, nK ; GetVoxIJKFromN( nN, nI, nJ, nK) ; @@ -3543,8 +3535,8 @@ VolZmap::ProcessVoxContXY( FlatVoxelContainer& VoxContXY, bool bPlus, TRIA3DEXLI int nMinJ = nJ ; int nMaxI = nI ; int nMaxJ = nJ ; - int nToolNum = ( *it).second.nTool ; - double dCordZ = ( *it).second.dHeigth ; + int nToolNum = it->second.nTool ; + double dCordZ = it->second.dHeigth ; // Flag sul ritrovamento di un rettangolo più grande. bool bOkI = true ; @@ -3641,9 +3633,6 @@ VolZmap::ProcessVoxContXY( FlatVoxelContainer& VoxContXY, bool bPlus, TRIA3DEXLI // Elimino il voxel da cui sono partito a ingrandire. VoxContXY.erase( nN) ; - - // Passo al primo voxel rimasto - it = VoxContXY.begin() ; } return true ; @@ -3653,10 +3642,11 @@ VolZmap::ProcessVoxContXY( FlatVoxelContainer& VoxContXY, bool bPlus, TRIA3DEXLI bool VolZmap::ProcessVoxContYZ( FlatVoxelContainer& VoxContYZ, bool bPlus, TRIA3DEXLIST& lstTria) const { - FlatVoxelContainer::iterator it = VoxContYZ.begin() ; - while ( it != VoxContYZ.end()) { + for ( auto it = VoxContYZ.begin() ; + it != VoxContYZ.end() ; + it = VoxContYZ.begin()) { - int nN = ( *it).first ; + int nN = it->first ; int nI, nJ, nK ; GetVoxIJKFromN( nN, nI, nJ, nK) ; @@ -3665,8 +3655,8 @@ VolZmap::ProcessVoxContYZ( FlatVoxelContainer& VoxContYZ, bool bPlus, TRIA3DEXLI int nMinK = nK ; int nMaxJ = nJ ; int nMaxK = nK ; - int nToolNum = ( *it).second.nTool ; - double dCordX = ( *it).second.dHeigth ; + int nToolNum = it->second.nTool ; + double dCordX = it->second.dHeigth ; // Flag sul ritrovamento di un rettangolo più grande. bool bOkJ = true ; @@ -3763,9 +3753,6 @@ VolZmap::ProcessVoxContYZ( FlatVoxelContainer& VoxContYZ, bool bPlus, TRIA3DEXLI // Elimino il voxel da cui sono partito a ingrandire. VoxContYZ.erase( nN) ; - - // Passo al primo voxel rimasto - it = VoxContYZ.begin() ; } return true ; @@ -3775,10 +3762,11 @@ VolZmap::ProcessVoxContYZ( FlatVoxelContainer& VoxContYZ, bool bPlus, TRIA3DEXLI bool VolZmap::ProcessVoxContXZ( FlatVoxelContainer& VoxContXZ, bool bPlus, TRIA3DEXLIST& lstTria) const { - FlatVoxelContainer::iterator it = VoxContXZ.begin() ; - while ( it != VoxContXZ.end()) { + for ( auto it = VoxContXZ.begin() ; + it != VoxContXZ.end() ; + it = VoxContXZ.begin()) { - int nN = ( *it).first ; + int nN = it->first ; int nI, nJ, nK ; GetVoxIJKFromN( nN, nI, nJ, nK) ; @@ -3787,8 +3775,8 @@ VolZmap::ProcessVoxContXZ( FlatVoxelContainer& VoxContXZ, bool bPlus, TRIA3DEXLI int nMinK = nK ; int nMaxI = nI ; int nMaxK = nK ; - int nToolNum = ( *it).second.nTool ; - double dCordY = ( *it).second.dHeigth ; + int nToolNum = it->second.nTool ; + double dCordY = it->second.dHeigth ; // Flag sul ritrovamento di un rettangolo più grande. bool bOkI = true ; @@ -3885,9 +3873,6 @@ VolZmap::ProcessVoxContXZ( FlatVoxelContainer& VoxContXZ, bool bPlus, TRIA3DEXLI // Elimino il voxel da cui sono partito a ingrandire. VoxContXZ.erase( nN) ; - - // Passo al primo voxel rimasto - it = VoxContXZ.begin() ; } return true ; @@ -3904,8 +3889,8 @@ VolZmap::Find( const FlatVoxelContainer& VoxCont, int nI, int nJ, int nK, double // cerco il voxel nel contenitore auto iter = VoxCont.find( nN) ; return ( iter != VoxCont.end() && - abs( dPos - ( *iter).second.dHeigth) < EPS_SMALL && - nTool == ( *iter).second.nTool) ; + abs( dPos - iter->second.dHeigth) < EPS_SMALL && + nTool == iter->second.nTool) ; } //----------------------------------------------------------------------------