From 2fcc500ac483540635a210568beef64a6dec016f Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Fri, 18 Sep 2020 10:02:47 +0000 Subject: [PATCH] =?UTF-8?q?EgtGeomKernel=202.2i2=20:=20-=20in=20VolZmap=20?= =?UTF-8?q?possibilit=C3=A0=20di=20modifica=20dinamica=20del=20rapporto=20?= =?UTF-8?q?VoxToDex=20con=20la=20funzione=20ChangeResolution=20-=20in=20Vo?= =?UTF-8?q?lZmap=20calcolo=20triangoli=20superficie=20corretta=20gestione?= =?UTF-8?q?=20soluzioni=20duali=20-=20in=20VolZmap=20corretti=20problemi?= =?UTF-8?q?=20quando=20non=20c'=C3=A8=20alcun=20dexel.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EgtGeomKernel.rc | Bin 11710 -> 11710 bytes VolZmap.cpp | 159 ++++++++++---------- VolZmap.h | 6 +- VolZmapCreation.cpp | 121 +++------------ VolZmapGraphics.cpp | 353 ++++++++++++++++++++++---------------------- VolZmapVolume.cpp | 22 +-- 6 files changed, 295 insertions(+), 366 deletions(-) diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 22e520549746568966126342551c8dabefacbd16..38a163a0ce0f9fe9bfe883d5ff690eb5cb4467e4 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.cpp b/VolZmap.cpp index 23ad976..f8736aa 100644 --- a/VolZmap.cpp +++ b/VolZmap.cpp @@ -35,7 +35,7 @@ GEOOBJ_REGISTER( VOL_ZMAP, NGE_V_ZMP, VolZmap) ; //---------------------------------------------------------------------------- VolZmap::VolZmap(void) : m_nStatus( TO_VERIFY), m_nMapNum( 0), m_nNumBlock( 0), m_nConnectedCompoCount( 0), m_dStep( 10.0), - m_nVoxNumPerBlock( N_VOXBLOCK), m_nShape( GENERIC), m_nTempProp( 0), m_Tool( true) + m_nVoxNumPerBlock( N_VOXBLOCK), m_nDexVoxRatio( 1), m_nShape( GENERIC), m_nTempProp( 0), m_Tool( true) { for ( int i = 0 ; i < N_MAPS ; ++ i) { m_nNx[i] = 0 ; @@ -473,13 +473,13 @@ VolZmap::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const // ciclo sui dexel (punti in basso con ciclo aggiunto per punti in alto di ultima riga) double dY = 0 ; for ( int j = 0 ; j <= m_nNy[0] ; ++ j) { - int jc = ( ( j != m_nNy[0]) ? j : m_nNy[0] -1) ; + int jc = ( ( j != m_nNy[0]) ? j : m_nNy[0] - 1) ; double dX = 0 ; // punto a sinistra di ogni dexel (aggiungo un ciclo per fare punto a destra di ultimo) for ( int i = 0 ; i <= m_nNx[0] ; ++ i) { - int ic = ( ( i != m_nNx[0]) ? i : m_nNx[0] -1) ; + int ic = ( ( i != m_nNx[0]) ? i : m_nNx[0] - 1) ; int nPos = ic + jc * m_nNx[0] ; - if ( m_Values[0][nPos].size() > 0) { + if ( nPos >= 0 && m_Values[0][nPos].size() > 0) { Point3d ptP = frUse.Orig() + dX * frUse.VersX() + dY * frUse.VersY() ; b3Ref.Add( ptP + m_Values[0][nPos][0].dMin * frUse.VersZ()) ; b3Ref.Add( ptP + m_Values[0][nPos][m_Values[0][nPos].size()-1].dMax * frUse.VersZ()) ; @@ -1269,37 +1269,9 @@ VolZmap::ClonePart( int nPart) const } } - // Calcolo il numero di voxel lungo x,y e z - int nVoxNumX = pVolume->m_nNx[0] / pVolume->N_DEXVOXRATIO + - ( pVolume->m_nNx[0] % pVolume->N_DEXVOXRATIO == 0 ? 1 : 2) ; - int nVoxNumY = pVolume->m_nNy[0] / pVolume->N_DEXVOXRATIO + - ( pVolume->m_nNy[0] % pVolume->N_DEXVOXRATIO == 0 ? 1 : 2) ; - int nVoxNumZ = pVolume->m_nNy[1] / pVolume->N_DEXVOXRATIO + - ( pVolume->m_nNy[1] % pVolume->N_DEXVOXRATIO == 0 ? 1 : 2) ; - // Definisco il numero di blocchi lungo x,y e z - pVolume->m_nFracLin[0] = max( 1, nVoxNumX / pVolume->m_nVoxNumPerBlock + - ( nVoxNumX % pVolume->m_nVoxNumPerBlock >= pVolume->m_nVoxNumPerBlock / 2 ? 1 : 0)) ; - pVolume->m_nFracLin[1] = max( 1, nVoxNumY / pVolume->m_nVoxNumPerBlock + - ( nVoxNumY % pVolume->m_nVoxNumPerBlock >= pVolume->m_nVoxNumPerBlock / 2 ? 1 : 0)) ; - pVolume->m_nFracLin[2] = max( 1, nVoxNumZ / pVolume->m_nVoxNumPerBlock + - ( nVoxNumZ % pVolume->m_nVoxNumPerBlock >= pVolume->m_nVoxNumPerBlock / 2 ? 1 : 0)) ; - - // Dimensiono il vettore dei blocchi - pVolume->m_nNumBlock = pVolume->m_nFracLin[0] * pVolume->m_nFracLin[1] * pVolume->m_nFracLin[2] ; - pVolume->m_BlockToUpdate.resize( pVolume->m_nNumBlock, true) ; - // Dimensiono il vettore dei contatori degli aggiornamenti della grafica dei blocchi - pVolume->m_BlockUpdatingCounter.resize( pVolume->m_nNumBlock + 1, 0) ; - // Dimensiono raccolta di voxel di confine - pVolume->m_InterBlockVox.resize( pVolume->m_nNumBlock) ; - // Dimensiono raccolta triangoli di feature tra blocchi - pVolume->m_InterBlockOriginalSharpTria.resize( pVolume->m_nNumBlock) ; - pVolume->m_BlockSharpTria.resize( pVolume->m_nNumBlock) ; - pVolume->m_BlockSmoothTria.resize( pVolume->m_nNumBlock) ; - pVolume->m_BlockBigTria.resize( pVolume->m_nNumBlock) ; - pVolume->m_SliceXY.resize( pVolume->m_nNumBlock) ; - pVolume->m_SliceXZ.resize( pVolume->m_nNumBlock) ; - pVolume->m_SliceYZ.resize( pVolume->m_nNumBlock) ; + if ( ! pVolume->CalcBlockNum()) + return false ; // Sistema di riferimento intrinseco del nuovo solido Point3d ptNewO = m_MapFrame.Orig() + Vector3d( dNewOx, dNewOy, dNewOz) ; @@ -1446,8 +1418,8 @@ VolZmap::SetToModifyDexelBlocks( int nGrid, int nDex, int nInt) int nYBlock[2] ; // Passo dal dexel al voxel - nI /= N_DEXVOXRATIO ; - nJ /= N_DEXVOXRATIO ; + nI /= m_nDexVoxRatio ; + nJ /= m_nDexVoxRatio ; nXBlock[0] = min( nI / m_nVoxNumPerBlock, m_nFracLin[0] - 1) ; nYBlock[0] = min( nJ / m_nVoxNumPerBlock, m_nFracLin[1] - 1) ; @@ -1463,10 +1435,10 @@ VolZmap::SetToModifyDexelBlocks( int nGrid, int nDex, int nInt) } // Numero di voxel lungo Z - int nVoxNumZ = int( m_nNy[1] / N_DEXVOXRATIO + ( m_nNy[1] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; + int nVoxNumZ = int( m_nNy[1] / m_nDexVoxRatio + ( m_nNy[1] % m_nDexVoxRatio == 0 ? 1 : 2)) ; - int nMinK = Clamp( int( floor( ( ( dMin - 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) - EPS_SMALL))), 0, nVoxNumZ - 2) ; - int nMaxK = Clamp( int( floor( ( ( dMax + 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) + EPS_SMALL))), 0, nVoxNumZ - 2) ; + int nMinK = Clamp( int( floor( ( ( dMin - 0.5 * m_dStep) / ( m_nDexVoxRatio * m_dStep) - EPS_SMALL))), 0, nVoxNumZ - 2) ; + int nMaxK = Clamp( int( floor( ( ( dMax + 0.5 * m_dStep) / ( m_nDexVoxRatio * m_dStep) + EPS_SMALL))), 0, nVoxNumZ - 2) ; int nMinZBlock = ( m_nMapNum == 1 ? 0 : Clamp( nMinK / int( m_nVoxNumPerBlock), 0, int( m_nFracLin[2] - 1))) ; int nMaxZBlock = min( int( m_nFracLin[2] - 1), nMaxK / int( m_nVoxNumPerBlock)) ; @@ -1490,8 +1462,8 @@ VolZmap::SetToModifyDexelBlocks( int nGrid, int nDex, int nInt) int nZBlock[2] ; // Passo dal dexel al voxel - nI /= N_DEXVOXRATIO ; - nJ /= N_DEXVOXRATIO ; + nI /= m_nDexVoxRatio ; + nJ /= m_nDexVoxRatio ; nYBlock[0] = min( nI / m_nVoxNumPerBlock, m_nFracLin[1] - 1) ; nZBlock[0] = min( nJ / m_nVoxNumPerBlock, m_nFracLin[2] - 1) ; @@ -1507,10 +1479,10 @@ VolZmap::SetToModifyDexelBlocks( int nGrid, int nDex, int nInt) } // Numero di voxel lungo X - int nVoxNumX = int( m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; + int nVoxNumX = int( m_nNx[0] / m_nDexVoxRatio + ( m_nNx[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; - int nMinI = Clamp( int( floor( ( ( dMin - 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) - EPS_SMALL))), 0, nVoxNumX - 2) ; - int nMaxI = Clamp( int( floor( ( ( dMax + 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) + EPS_SMALL))), 0, nVoxNumX - 2) ; + int nMinI = Clamp( int( floor( ( ( dMin - 0.5 * m_dStep) / ( m_nDexVoxRatio * m_dStep) - EPS_SMALL))), 0, nVoxNumX - 2) ; + int nMaxI = Clamp( int( floor( ( ( dMax + 0.5 * m_dStep) / ( m_nDexVoxRatio * m_dStep) + EPS_SMALL))), 0, nVoxNumX - 2) ; int nMinXBlock = Clamp( nMinI / int( m_nVoxNumPerBlock), 0, int( m_nFracLin[0] - 1)) ; int nMaxXBlock = min( int( m_nFracLin[0] - 1), nMaxI / int( m_nVoxNumPerBlock)) ; @@ -1534,8 +1506,8 @@ VolZmap::SetToModifyDexelBlocks( int nGrid, int nDex, int nInt) int nZBlock[2] ; // Passo dal dexel al voxel - nI /= N_DEXVOXRATIO ; - nJ /= N_DEXVOXRATIO ; + nI /= m_nDexVoxRatio ; + nJ /= m_nDexVoxRatio ; nXBlock[0] = min( nJ / m_nVoxNumPerBlock, m_nFracLin[0] - 1) ; nZBlock[0] = min( nI / m_nVoxNumPerBlock, m_nFracLin[2] - 1) ; @@ -1551,10 +1523,10 @@ VolZmap::SetToModifyDexelBlocks( int nGrid, int nDex, int nInt) } // Numero di voxel lungo Y - int nVoxNumY = int( m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; + int nVoxNumY = int( m_nNy[0] / m_nDexVoxRatio + ( m_nNy[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; - int nMinJ = Clamp( int( floor( ( ( dMin - 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) - EPS_SMALL))), 0, nVoxNumY - 2) ; - int nMaxJ = Clamp( int( floor( ( ( dMax + 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) + EPS_SMALL))), 0, nVoxNumY - 2) ; + int nMinJ = Clamp( int( floor( ( ( dMin - 0.5 * m_dStep) / ( m_nDexVoxRatio * m_dStep) - EPS_SMALL))), 0, nVoxNumY - 2) ; + int nMaxJ = Clamp( int( floor( ( ( dMax + 0.5 * m_dStep) / ( m_nDexVoxRatio * m_dStep) + EPS_SMALL))), 0, nVoxNumY - 2) ; int nMinYBlock = Clamp( nMinJ / int( m_nVoxNumPerBlock), 0, int( m_nFracLin[1] - 1)) ; int nMaxYBlock = min( int( m_nFracLin[1] - 1), nMaxJ / int( m_nVoxNumPerBlock)) ; @@ -1823,32 +1795,10 @@ VolZmap::Compact( void) m_Values[nMap].emplace_back( Values[nMap][nD]) ; } } - - // Calcolo il numero di voxel lungo x,y e z - int nVoxNumX = m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2) ; - int nVoxNumY = m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2) ; - int nVoxNumZ = m_nNy[1] / N_DEXVOXRATIO + ( m_nNy[1] % N_DEXVOXRATIO == 0 ? 1 : 2) ; - + // Definisco il numero di blocchi lungo x,y e z - m_nFracLin[0] = max( 1, nVoxNumX / m_nVoxNumPerBlock + ( nVoxNumX % m_nVoxNumPerBlock >= m_nVoxNumPerBlock / 2 ? 1 : 0)) ; - m_nFracLin[1] = max( 1, nVoxNumY / m_nVoxNumPerBlock + ( nVoxNumY % m_nVoxNumPerBlock >= m_nVoxNumPerBlock / 2 ? 1 : 0)) ; - m_nFracLin[2] = max( 1, nVoxNumZ / m_nVoxNumPerBlock + ( nVoxNumZ % m_nVoxNumPerBlock >= m_nVoxNumPerBlock / 2 ? 1 : 0)) ; - - // Dimensiono il vettore dei blocchi - m_nNumBlock = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ; - m_BlockToUpdate.resize( m_nNumBlock, true) ; - // Dimensiono il vettore dei contatori di aggiornamenti dei blocchi - m_BlockUpdatingCounter.resize( m_nNumBlock, 0) ; - // Dimensiono raccolta di voxel di confine - m_InterBlockVox.resize( m_nNumBlock) ; - // Dimensiono raccolta triangoli di feature tra blocchi - m_InterBlockOriginalSharpTria.resize( m_nNumBlock) ; - m_BlockSharpTria.resize( m_nNumBlock) ; - m_BlockSmoothTria.resize( m_nNumBlock) ; - m_BlockBigTria.resize( m_nNumBlock) ; - m_SliceXY.resize( m_nNumBlock) ; - m_SliceXZ.resize( m_nNumBlock) ; - m_SliceYZ.resize( m_nNumBlock) ; + if ( ! CalcBlockNum()) + return false ; // Sistema di riferimento intrinseco del nuovo solido Point3d ptNewO = m_MapFrame.Orig() + Vector3d( dNewOx, dNewOy, dNewOz) ; @@ -1860,6 +1810,67 @@ VolZmap::Compact( void) return true ; } +//---------------------------------------------------------------------------- +bool +VolZmap::ChangeResolution( int nDexVoxRatio) +{ + if ( nDexVoxRatio < 1 || nDexVoxRatio > 2) + return false ; + if ( nDexVoxRatio != m_nDexVoxRatio) { + m_nDexVoxRatio = nDexVoxRatio ; + if ( CalcBlockNum()) { + ResetGraphics() ; + m_OGrMgr.Clear() ; + return true ; + } + m_nDexVoxRatio = ( m_nDexVoxRatio == 1 ? 2 : 1) ; + return false ; + } + return true ; +} + +//---------------------------------------------------------------------------- +bool +VolZmap::CalcBlockNum( void) +{ + // Calcolo il numero di voxel lungo X e Y + int nVoxNumX = m_nNx[0] / m_nDexVoxRatio + ( m_nNx[0] % m_nDexVoxRatio == 0 ? 1 : 2) ; + int nVoxNumY = m_nNy[0] / m_nDexVoxRatio + ( m_nNy[0] % m_nDexVoxRatio == 0 ? 1 : 2) ; + if ( nVoxNumX == 0 || nVoxNumY == 0) + return false ; + // Definisco il numero di blocchi lungo X e Y + m_nFracLin[0] = max( 1, nVoxNumX / m_nVoxNumPerBlock + ( nVoxNumX % m_nVoxNumPerBlock > m_nVoxNumPerBlock / 4 ? 1 : 0)) ; + m_nFracLin[1] = max( 1, nVoxNumY / m_nVoxNumPerBlock + ( nVoxNumY % m_nVoxNumPerBlock > m_nVoxNumPerBlock / 4 ? 1 : 0)) ; + if ( m_nMapNum == 1) { + m_nFracLin[2] = 1 ; + m_nNumBlock = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ; + return true ; + } + // Calcolo il numero di voxel lungo Z + int nVoxNumZ = m_nNy[1] / m_nDexVoxRatio + ( m_nNy[1] % m_nDexVoxRatio == 0 ? 1 : 2) ; + // Definisco il numero di blocchi lungo Z + m_nFracLin[2] = max( 1, nVoxNumZ / m_nVoxNumPerBlock + ( nVoxNumZ % m_nVoxNumPerBlock > m_nVoxNumPerBlock / 4 ? 1 : 0)) ; + // Dimensiono e setto il vettore dei blocchi a da ricalcolare e il vettore di contatori di aggiornamenti della grafica + m_nNumBlock = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ; + m_BlockToUpdate.clear() ; + m_BlockToUpdate.resize( m_nNumBlock, true) ; + m_BlockUpdatingCounter.clear() ; + m_BlockUpdatingCounter.resize( m_nNumBlock + ( m_nMapNum == 1 ? 0 : 1), 0) ; + + // Dimensiono raccolta di voxel, triangoli di feature tra blocchi e di segnalatori di materiale fra voxel + m_InterBlockVox.resize( m_nNumBlock) ; + m_InterBlockOriginalSharpTria.resize( m_nNumBlock) ; + m_InterBlockSharpTria.resize( m_nNumBlock) ; + m_BlockSharpTria.resize( m_nNumBlock) ; + m_BlockSmoothTria.resize( m_nNumBlock) ; + m_BlockBigTria.resize( m_nNumBlock) ; + m_SingleMapTria.resize( m_nNumBlock) ; + m_SliceXY.resize( m_nNumBlock) ; + m_SliceXZ.resize( m_nNumBlock) ; + m_SliceYZ.resize( m_nNumBlock) ; + return true ; +} + //---------------------------------------------------------------------------- bool VolZmap::SetTolerances( double dLinTol, double dAngTolDeg) diff --git a/VolZmap.h b/VolZmap.h index 7043916..a59a080 100644 --- a/VolZmap.h +++ b/VolZmap.h @@ -105,6 +105,7 @@ class VolZmap : public IVolZmap, public IGeoObjRW VolZmap* ClonePart( int nPart) const override ; bool RemovePart( int nPart) override ; int GetPartMinDistFromPoint( const Point3d& ptP) const override ; + bool ChangeResolution( int nDexVoxRatio) ; public : // IGeoObjRW int GetNgeId( void) const override ; @@ -193,7 +194,7 @@ class VolZmap : public IVolZmap, public IGeoObjRW bool CreateSharpFeatureTriangle( int nBlock, const VoxelContainer& vVox) const ; bool CreateSmoothTriangle( int nIndex, int nVertNum, AppliedVector TriVert[], bool bWasSharp, SmoothTriaStruct& VoxSmoothTria) const ; bool FlipEdgesII( int nBlock) const ; - bool FlipEdgesBB() const ; + bool FlipEdgesBB( void) const ; bool IsThereMat( int nI, int nJ, int nK) const ; int CalcIndex( int nI, int nJ, int nK) const ; bool IntersPos( int nVec1[], int nVec2[], bool bFirstCorner, AppliedVector& vfField) const ; @@ -331,6 +332,7 @@ class VolZmap : public IVolZmap, public IGeoObjRW bool IsVoxelOnBoxEdge( int i, int j, int k) const ; bool CheckForFanNodeInterferance( AppliedVector CompVecField[], Point3d& ptFanVert, int nBasePointNum, int nVoxConfig, int nVoxI, int nVoxJ, int nVoxK) const ; + bool CalcBlockNum( void) ; bool IsTriangleOnBorder( const Triangle3dEx& trTria, const int nBlockLimits[], const int nVoxIJK[]) const ; // Funzioni per facce canoniche con grandi triangoli bool ProcessVoxContXY( FlatVoxelContainer& VoxContXY, int nBlock, bool bPlus) const ; @@ -359,7 +361,6 @@ class VolZmap : public IVolZmap, public IGeoObjRW enum Shape { GENERIC = 0, BOX = 1, EXTRUSION = 2} ; static const int N_MAPS = 3 ; static const int N_VOXBLOCK = 32 ; - static const int N_DEXVOXRATIO = 1 ; private : ObjGraphicsMgr m_OGrMgr ; // gestore grafica dell'oggetto @@ -388,6 +389,7 @@ class VolZmap : public IVolZmap, public IGeoObjRW int m_nShape ; // Forma : 0 generica, 1 box, 2 estrusione int m_nVoxNumPerBlock ; // Numero di voxel per blocco + int m_nDexVoxRatio ; // Rapporto dexel voxel int m_nFracLin[3] ; // Numero di blocchi per ogni asse int m_nNumBlock ; // Numero totale di blocchi diff --git a/VolZmapCreation.cpp b/VolZmapCreation.cpp index 597b30d..0b80a21 100644 --- a/VolZmapCreation.cpp +++ b/VolZmapCreation.cpp @@ -46,16 +46,8 @@ 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] = int( ( dLengthX + EPS_SMALL) / m_dStep + 0.5) ; - m_nNy[0] = int( ( dLengthY + EPS_SMALL) / m_dStep + 0.5) ; - - // Calcolo il numero di voxel lungo X e Y - int nVoxNumX = m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2) ; - 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( 1, int( nVoxNumX * 1.0 / m_nVoxNumPerBlock + 0.7)) ; - m_nFracLin[1] = max( 1, int( nVoxNumY * 1.0 / m_nVoxNumPerBlock + 0.7)) ; + m_nNx[0] = max( int( ( dLengthX + EPS_SMALL) / m_dStep + 0.5), 1) ; + m_nNy[0] = max( int( ( dLengthY + EPS_SMALL) / m_dStep + 0.5), 1) ; // Numero di componenti connesse m_nConnectedCompoCount = 1 ; @@ -63,13 +55,9 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL // Se tridexel if ( bTriDex) { m_nNx[1] = m_nNy[0] ; - m_nNy[1] = int( ( dLengthZ + EPS_SMALL) / m_dStep + 0.5) ; + m_nNy[1] = max( int( ( dLengthZ + EPS_SMALL) / m_dStep + 0.5), 1) ; m_nNx[2] = m_nNy[1] ; m_nNy[2] = m_nNx[0] ; - // Calcolo il numero di voxel lungo Z - 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( 1, int( nVoxNumZ * 1.0 / m_nVoxNumPerBlock + 0.7)) ; } // altrimenti mono dexel @@ -78,10 +66,12 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL m_nNy[1] = 0 ; m_nNx[2] = 0 ; m_nNy[2] = 0 ; - // Definisco il numero di blocchi lungo z - m_nFracLin[2] = 1 ; } + // Definisco il numero di blocchi lungo x,y e z + if ( ! CalcBlockNum()) + return false ; + // Definizione della mappa // Creazione delle mappe @@ -133,28 +123,9 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL m_dMinZ[2] = 0 ; m_dMaxZ[2] = ( bTriDex ? dLengthY : 0) ; - // Dimensiono e setto il vettore dei blocchi a da ricalcolare e il vettore di contatori di aggiornamenti della grafica - m_nNumBlock = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ; - m_BlockToUpdate.clear() ; - m_BlockToUpdate.resize( m_nNumBlock, true) ; - m_BlockUpdatingCounter.clear() ; - m_BlockUpdatingCounter.resize( m_nNumBlock + ( m_nMapNum == 1 ? 0 : 1), 0) ; - - // Tipologia + // Tipologia m_nShape = BOX ; - - // Dimensiono raccolta di voxel, triangoli di feature tra blocchi e di segnalatori di materiale fra voxel - m_InterBlockVox.resize( m_nNumBlock) ; - m_InterBlockOriginalSharpTria.resize( m_nNumBlock) ; - m_InterBlockSharpTria.resize( m_nNumBlock) ; - m_BlockSharpTria.resize( m_nNumBlock) ; - m_BlockSmoothTria.resize( m_nNumBlock) ; - m_BlockBigTria.resize( m_nNumBlock) ; - m_SingleMapTria.resize( m_nNumBlock) ; - m_SliceXY.resize( m_nNumBlock) ; - m_SliceXZ.resize( m_nNumBlock) ; - m_SliceYZ.resize( m_nNumBlock) ; - + // Aggiornamento dello stato m_nStatus = OK ; @@ -195,14 +166,6 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double // 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 - int nVoxNumX = m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2) ; - 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( 1, int( nVoxNumX * 1.0 / m_nVoxNumPerBlock + 0.7)) ; - m_nFracLin[1] = max( 1, int( nVoxNumY * 1.0 / m_nVoxNumPerBlock + 0.7)) ; - // Numero di componenti connesse m_nConnectedCompoCount = Surf.GetChunkCount() ; @@ -216,10 +179,6 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double 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 - 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( 1, int( nVoxNumZ * 1.0 / m_nVoxNumPerBlock + 0.7)) ; } else { @@ -229,10 +188,12 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double m_nNx[2] = 0 ; m_nNy[2] = 0 ; m_nDim[2] = 0 ; - // Definisco il numero di blocchi lungo z - m_nFracLin[2] = 1 ; } + // Definisco il numero di blocchi lungo x,y e z + if ( ! CalcBlockNum()) + return false ; + // Metto in cache le curve di contorno della regione ICURVEPOVECTOR vpCrvs ; INTVECTOR vnCompo ; @@ -447,25 +408,6 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double m_dMinZ[2] = 0 ; m_dMaxZ[2] = ( bTriDex ? dLengthY : 0) ; - // Dimensiono e setto il vettore dei blocchi a da ricalcolare e il vettore di contatori di aggiornamenti della grafica - m_nNumBlock = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ; - m_BlockToUpdate.clear() ; - m_BlockToUpdate.resize( m_nNumBlock, true) ; - m_BlockUpdatingCounter.clear() ; - m_BlockUpdatingCounter.resize( m_nNumBlock + ( m_nMapNum == 1 ? 0 : 1), 0) ; - - // Dimensiono raccolta di voxel, triangoli di feature tra blocchi e di segnalatori di materiale fra voxel - m_InterBlockVox.resize( m_nNumBlock) ; - m_InterBlockOriginalSharpTria.resize( m_nNumBlock) ; - m_InterBlockSharpTria.resize( m_nNumBlock) ; - m_BlockSharpTria.resize( m_nNumBlock) ; - m_BlockSmoothTria.resize( m_nNumBlock) ; - m_BlockBigTria.resize( m_nNumBlock) ; - m_SingleMapTria.resize( m_nNumBlock) ; - m_SliceXY.resize( m_nNumBlock) ; - m_SliceXZ.resize( m_nNumBlock) ; - m_SliceYZ.resize( m_nNumBlock) ; - // Tipologia m_nShape = ( IsBox() ? BOX : EXTRUSION) ; @@ -515,13 +457,7 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dStep, bool bTriDex 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 - int nVoxNumX = m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2) ; - 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( 1, int( nVoxNumX * 1.0 / m_nVoxNumPerBlock + 0.7)) ; - m_nFracLin[1] = max( 1, int( nVoxNumY * 1.0 / m_nVoxNumPerBlock + 0.7)) ; - + // Numero di componenti connesse da calcolare m_nConnectedCompoCount = - 1 ; @@ -535,10 +471,6 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dStep, bool bTriDex 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 - 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( 1, int( nVoxNumZ * 1.0 / m_nVoxNumPerBlock + 0.7)) ; } else { @@ -548,10 +480,12 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dStep, bool bTriDex m_nNx[2] = 0 ; m_nNy[2] = 0 ; m_nDim[2] = 0 ; - // Definisco il numero di blocchi lungo z - m_nFracLin[2] = 1 ; } + // Definisco il numero di blocchi lungo x,y e z + if ( ! CalcBlockNum()) + return false ; + // ciclo sulle griglie for ( int g = 0 ; g < m_nMapNum ; ++ g) { @@ -667,25 +601,6 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dStep, bool bTriDex m_dMinZ[2] = 0 ; m_dMaxZ[2] = ( bTriDex ? vtLen.y : 0) ; - // Dimensiono e setto il vettore dei blocchi a da ricalcolare e il vettore di contatori di aggiornamenti della grafica - m_nNumBlock = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ; - m_BlockToUpdate.clear() ; - m_BlockToUpdate.resize( m_nNumBlock, true) ; - m_BlockUpdatingCounter.clear() ; - m_BlockUpdatingCounter.resize( m_nNumBlock + ( m_nMapNum == 1 ? 0 : 1), 0) ; - - // Dimensiono raccolta di voxel, triangoli di feature tra blocchi e di segnalatori di materiale fra voxel - m_InterBlockVox.resize( m_nNumBlock) ; - m_InterBlockOriginalSharpTria.resize( m_nNumBlock) ; - m_InterBlockSharpTria.resize( m_nNumBlock) ; - m_BlockSharpTria.resize( m_nNumBlock) ; - m_BlockSmoothTria.resize( m_nNumBlock) ; - m_BlockBigTria.resize( m_nNumBlock) ; - m_SingleMapTria.resize( m_nNumBlock) ; - m_SliceXY.resize( m_nNumBlock) ; - m_SliceXZ.resize( m_nNumBlock) ; - m_SliceYZ.resize( m_nNumBlock) ; - // Tipologia m_nShape = ( IsBox() ? BOX : GENERIC) ; diff --git a/VolZmapGraphics.cpp b/VolZmapGraphics.cpp index d8a9683..2855090 100644 --- a/VolZmapGraphics.cpp +++ b/VolZmapGraphics.cpp @@ -327,8 +327,8 @@ VolZmap::FindAdjComp( const vector& vVecVox, int nCurBlock, int int nCurIJK[3] ; 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 ; + Voxel CurVox = ( bInnerVox ? ( *vVecVox[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) { @@ -625,14 +625,14 @@ VolZmap::UpdateSingleMapGraphics( void) const int nJBlock = int( t) / int( m_nFracLin[0]) ; // Calcolo limiti per l'indice i - int nStartI = nIBlock * int( m_nVoxNumPerBlock) * N_DEXVOXRATIO ; + int nStartI = nIBlock * int( m_nVoxNumPerBlock) * m_nDexVoxRatio ; int nEndI = ( nIBlock + 1 == int( m_nFracLin[0]) ? - int( m_nNx[0]) : ( nIBlock + 1) * int( m_nVoxNumPerBlock)) * N_DEXVOXRATIO ; + int( m_nNx[0]) : ( nIBlock + 1) * int( m_nVoxNumPerBlock)) * m_nDexVoxRatio ; // Calcolo limiti per l'indice j - int nStartJ = nJBlock * int( m_nVoxNumPerBlock) * N_DEXVOXRATIO ; + int nStartJ = nJBlock * int( m_nVoxNumPerBlock) * m_nDexVoxRatio ; int nEndJ = ( nJBlock + 1 == int( m_nFracLin[1]) ? - int( m_nNy[0]) : ( nJBlock + 1) * int( m_nVoxNumPerBlock)) * N_DEXVOXRATIO ; + int( m_nNy[0]) : ( nJBlock + 1) * int( m_nVoxNumPerBlock)) * m_nDexVoxRatio ; // Ciclo su i e j for ( int i = nStartI ; i < nEndI ; i += MAX_DIM_CHUNK) { @@ -1063,7 +1063,7 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const for ( int i = nLimits[0] ; i < nLimits[1] ; ++ i) { for ( int j = nLimits[2] ; j < nLimits[3] ; ++ j) { for ( int k = nLimits[4] ; k < nLimits[5] ; ++ k) { - + if ( m_nShape == BOX && ! IsVoxelOnBoxEdge( i, j, k)) continue ; // Classificazione dei vertici: interni o esterni al materiale @@ -1364,7 +1364,7 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const } } - bool bNewTopology = Config3Duality( nIndex) ? bMatOnSlice : ! bMatOnSlice ; + bool bNewTopology = ( bDefTopology ? ! bMatOnSlice : bMatOnSlice) ; // Si passa alla seconda topologia if ( bNewTopology) { @@ -1541,7 +1541,7 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const m_SliceXY[nSlBlockN].emplace( nSliceN, bMatOnSlice) ; } } - bool bNewTopology = ( Config6Duality( nIndex) ? bMatOnSlice : ! bMatOnSlice) ; + bool bNewTopology = ( bDefTopology ? ! bMatOnSlice : bMatOnSlice) ; // Si deve passare alla seconda topologia if ( bNewTopology) { // Ricerca del caso corrispondente della nuova topologia @@ -1756,14 +1756,14 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const } // Uso le informazioni per scegliere la topologia int nFaceWithMatNum = 0 ; - if ( bMatOnSliceXZ) + if ( bMatOnSliceXZ && ! bDefSliceXZ) ++ nFaceWithMatNum ; - if ( bMatOnSliceYZ) + if ( bMatOnSliceYZ && ! bDefSliceYZ) ++ nFaceWithMatNum ; - if ( bMatOnSliceXY) + if ( bMatOnSliceXY && ! bDefSliceXY) ++ nFaceWithMatNum ; if ( nFaceWithMatNum == 1) { - int nFaceCase = ( bMatOnSliceYZ ? 0 : (bMatOnSliceXZ ? 1 : 2)) ; + int nFaceCase = ( bMatOnSliceYZ ? 0 : ( bMatOnSliceXZ ? 1 : 2)) ; // Aggiorno numero di componenti nComponents = Cases7Plus[nCount][nFaceCase][1][0] ; // Riaggiorno gli offsets @@ -1900,7 +1900,7 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const } } } - bool bNewTopology = bMatOnSlice ; + bool bNewTopology = ( bDefStTopology ? ! bMatOnSlice : bMatOnSlice) ; // Si passa alla seconda topologia if ( bNewTopology) { // Ricerca del caso corrispondente della nuova topologia @@ -2044,12 +2044,12 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const } } if ( bOverTurning) { - Point3d ptMinDiag( ( i * N_DEXVOXRATIO + 0.5) * m_dStep, - ( j * N_DEXVOXRATIO + 0.5) * m_dStep, - ( k * N_DEXVOXRATIO + 0.5) * m_dStep) ; - Point3d ptMaxDiag( ( ( i + 1) * N_DEXVOXRATIO + 0.5) * m_dStep, - ( ( j + 1) * N_DEXVOXRATIO + 0.5) * m_dStep, - ( ( k + 1) * N_DEXVOXRATIO + 0.5) * m_dStep) ; + Point3d ptMinDiag( ( i * m_nDexVoxRatio + 0.5) * m_dStep, + ( j * m_nDexVoxRatio + 0.5) * m_dStep, + ( k * m_nDexVoxRatio + 0.5) * m_dStep) ; + Point3d ptMaxDiag( ( ( i + 1) * m_nDexVoxRatio + 0.5) * m_dStep, + ( ( j + 1) * m_nDexVoxRatio + 0.5) * m_dStep, + ( ( k + 1) * m_nDexVoxRatio + 0.5) * m_dStep) ; double dNewU1, dNewU2 ; if ( IntersLineBox( ptSol, vtNullSpace, ptMinDiag, ptMaxDiag, dNewU1, dNewU2)) { if ( dNewU1 > 0.) { @@ -2112,8 +2112,8 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const break ; } } - int nPrevL = nNotParIndex > 0 ? nNotParIndex - 1 : nVertComp[nComp] - 1 ; - int nNextL = nNotParIndex < nVertComp[nComp] - 1 ? nNotParIndex + 1 : 0 ; + int nPrevL = ( nNotParIndex > 0 ? nNotParIndex - 1 : nVertComp[nComp] - 1) ; + int nNextL = ( nNotParIndex < nVertComp[nComp] - 1 ? nNotParIndex + 1 : 0) ; Vector3d vtPrevN = ( CompoVert[nComp][nNotParIndex].ptPApp - ptSol) ^ ( CompoVert[nComp][nPrevL].ptPApp - ptSol) ; Vector3d vtNextN = ( CompoVert[nComp][nNextL].ptPApp - ptSol) ^ ( CompoVert[nComp][nNotParIndex].ptPApp - ptSol) ; vtPrevN.Normalize() ; @@ -2205,15 +2205,15 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const // Costruisco i triangoli paralleli al piano YZ if ( nBlockIJK[0] == 0 || nBlockIJK[0] + 1 == m_nFracLin[0]) { // Indici dei dexel corrispondenti al confine inferiore fra voxel piatti e feature - int nDexMinJ = ( nBlockIJK[1] == 0 ? N_DEXVOXRATIO * ( nFirstVoxJ + 1) : - N_DEXVOXRATIO * nBlockIJK[1] * m_nVoxNumPerBlock) ; - int nDexMinK = ( nBlockIJK[2] == 0 ? N_DEXVOXRATIO * ( nFirstVoxK + 1) : - N_DEXVOXRATIO * nBlockIJK[2] * m_nVoxNumPerBlock) ; + int nDexMinJ = ( nBlockIJK[1] == 0 ? m_nDexVoxRatio * ( nFirstVoxJ + 1) : + m_nDexVoxRatio * nBlockIJK[1] * m_nVoxNumPerBlock) ; + int nDexMinK = ( nBlockIJK[2] == 0 ? m_nDexVoxRatio * ( nFirstVoxK + 1) : + m_nDexVoxRatio * nBlockIJK[2] * m_nVoxNumPerBlock) ; // Indici dei dexel corrispondenti al confine superiore fra voxel piatti e feature - int nDexMaxJ = ( nBlockIJK[1] + 1 < int( m_nFracLin[1]) ? N_DEXVOXRATIO * ( nBlockIJK[1] + 1) * m_nVoxNumPerBlock : - N_DEXVOXRATIO * nLastVoxJ) ; - int nDexMaxK = ( nBlockIJK[2] + 1 < int( m_nFracLin[2]) ? N_DEXVOXRATIO * ( nBlockIJK[2] + 1) * m_nVoxNumPerBlock : - N_DEXVOXRATIO * nLastVoxK) ; + int nDexMaxJ = ( nBlockIJK[1] + 1 < int( m_nFracLin[1]) ? m_nDexVoxRatio * ( nBlockIJK[1] + 1) * m_nVoxNumPerBlock : + m_nDexVoxRatio * nLastVoxJ) ; + int nDexMaxK = ( nBlockIJK[2] + 1 < int( m_nFracLin[2]) ? m_nDexVoxRatio * ( nBlockIJK[2] + 1) * m_nVoxNumPerBlock : + m_nDexVoxRatio * nLastVoxK) ; // Determino coordinate minime e massime dei punti dei triangoli double dYMin = ( nDexMinJ + 0.5) * m_dStep ; double dZMin = ( nDexMinK + 0.5) * m_dStep ; @@ -2244,15 +2244,15 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const // Costruisco i triangoli paralleli al piano XZ if ( nBlockIJK[1] == 0 || nBlockIJK[1] + 1 == m_nFracLin[1]) { // Indici dei dexel corrispondenti al confine inferiore fra voxel piatti e feature - int nDexMinI = ( nBlockIJK[0] == 0 ? N_DEXVOXRATIO * ( nFirstVoxI + 1) : - N_DEXVOXRATIO * nBlockIJK[0] * m_nVoxNumPerBlock) ; - int nDexMinK = ( nBlockIJK[2] == 0 ? N_DEXVOXRATIO * ( nFirstVoxK + 1) : - N_DEXVOXRATIO * nBlockIJK[2] * m_nVoxNumPerBlock) ; + int nDexMinI = ( nBlockIJK[0] == 0 ? m_nDexVoxRatio * ( nFirstVoxI + 1) : + m_nDexVoxRatio * nBlockIJK[0] * m_nVoxNumPerBlock) ; + int nDexMinK = ( nBlockIJK[2] == 0 ? m_nDexVoxRatio * ( nFirstVoxK + 1) : + m_nDexVoxRatio * nBlockIJK[2] * m_nVoxNumPerBlock) ; // Indici dei dexel corrispondenti al confine superiore fra voxel piatti e feature - int nDexMaxI = ( nBlockIJK[0] + 1 < int( m_nFracLin[0]) ? N_DEXVOXRATIO * ( nBlockIJK[0] + 1) * m_nVoxNumPerBlock : - N_DEXVOXRATIO * nLastVoxI) ; - int nDexMaxK = ( nBlockIJK[2] + 1 < int( m_nFracLin[2]) ? N_DEXVOXRATIO * ( nBlockIJK[2] + 1) * m_nVoxNumPerBlock : - N_DEXVOXRATIO * nLastVoxK) ; + int nDexMaxI = ( nBlockIJK[0] + 1 < int( m_nFracLin[0]) ? m_nDexVoxRatio * ( nBlockIJK[0] + 1) * m_nVoxNumPerBlock : + m_nDexVoxRatio * nLastVoxI) ; + int nDexMaxK = ( nBlockIJK[2] + 1 < int( m_nFracLin[2]) ? m_nDexVoxRatio * ( nBlockIJK[2] + 1) * m_nVoxNumPerBlock : + m_nDexVoxRatio * nLastVoxK) ; // Determino coordinate minime e massime dei punti dei triangoli double dXMin = ( nDexMinI + 0.5) * m_dStep ; double dZMin = ( nDexMinK + 0.5) * m_dStep ; @@ -2283,15 +2283,15 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const // Costruisco i triangoli paralleli al piano XY if ( nBlockIJK[2] == 0 || nBlockIJK[2] + 1 == m_nFracLin[2]) { // Indici dei dexel corrispondenti al confine inferiore fra voxel piatti e feature - int nDexMinI = ( nBlockIJK[0] == 0 ? N_DEXVOXRATIO * ( nFirstVoxI + 1) : - N_DEXVOXRATIO * nBlockIJK[0] * m_nVoxNumPerBlock) ; - int nDexMinJ = ( nBlockIJK[1] == 0 ? N_DEXVOXRATIO * ( nFirstVoxJ + 1) : - N_DEXVOXRATIO * nBlockIJK[1] * m_nVoxNumPerBlock) ; + int nDexMinI = ( nBlockIJK[0] == 0 ? m_nDexVoxRatio * ( nFirstVoxI + 1) : + m_nDexVoxRatio * nBlockIJK[0] * m_nVoxNumPerBlock) ; + int nDexMinJ = ( nBlockIJK[1] == 0 ? m_nDexVoxRatio * ( nFirstVoxJ + 1) : + m_nDexVoxRatio * nBlockIJK[1] * m_nVoxNumPerBlock) ; // Indici dei dexel corrispondenti al confine superiore fra voxel piatti e feature - int nDexMaxI = ( nBlockIJK[0] + 1 < int( m_nFracLin[0]) ? N_DEXVOXRATIO * ( nBlockIJK[0] + 1) * m_nVoxNumPerBlock : - N_DEXVOXRATIO * nLastVoxI) ; - int nDexMaxJ = ( nBlockIJK[1] + 1 < int( m_nFracLin[1]) ? N_DEXVOXRATIO * ( nBlockIJK[1] + 1) * m_nVoxNumPerBlock : - N_DEXVOXRATIO * nLastVoxJ) ; + int nDexMaxI = ( nBlockIJK[0] + 1 < int( m_nFracLin[0]) ? m_nDexVoxRatio * ( nBlockIJK[0] + 1) * m_nVoxNumPerBlock : + m_nDexVoxRatio * nLastVoxI) ; + int nDexMaxJ = ( nBlockIJK[1] + 1 < int( m_nFracLin[1]) ? m_nDexVoxRatio * ( nBlockIJK[1] + 1) * m_nVoxNumPerBlock : + m_nDexVoxRatio * nLastVoxJ) ; // Determino coordinate minime e massime dei punti dei triangoli double dXMin = ( nDexMinI + 0.5) * m_dStep ; double dYMin = ( nDexMinJ + 0.5) * m_dStep ; @@ -2362,8 +2362,8 @@ VolZmap::RegulateFeaturesChain( vector& vVecVox) const int nBorSizeF = int( vBordNearFirst.size()) ; for ( int nF = 0 ; nF < nInnSizeF + nBorSizeF ; nF += 3) { // Indice e vettore corrente dei primi vicini - int nFCur = nF < nInnSizeF ? nF : nF - nInnSizeF ; - INTVECTOR vVecNFCur = nF < nInnSizeF ? vNearFirst : vBordNearFirst ; + int nFCur = ( nF < nInnSizeF ? nF : nF - nInnSizeF) ; + INTVECTOR vVecNFCur = ( nF < nInnSizeF ? vNearFirst : vBordNearFirst) ; // Cerco i secondi vicini INTVECTOR vNearSecond, vBordNearSecond ; FindAdjComp( vVecVox, vVecNFCur[nFCur], vVecNFCur[nFCur+1], vVecNFCur[nFCur+2], @@ -2373,8 +2373,8 @@ VolZmap::RegulateFeaturesChain( vector& vVecVox) const 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 ; - INTVECTOR vVecNSCur = nS < nInnSizeS ? vNearSecond : vBordNearSecond ; + int nNSCur = ( nS < nInnSizeS ? nS : nS - nInnSizeS) ; + INTVECTOR vVecNSCur = ( nS < nInnSizeS ? vNearSecond : vBordNearSecond) ; // Escludo dai secondi i primi vicini bool bFirst = false ; if ( vVecNSCur[nNSCur] == nBlock && @@ -2399,10 +2399,10 @@ VolZmap::RegulateFeaturesChain( vector& vVecVox) const if ( bFirst) continue ; // Se necessario regolarizzo la catena - 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 ; + 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 ; @@ -2494,12 +2494,12 @@ VolZmap::RegulateFeaturesChain( vector& vVecVox) const //vtDLine = 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, - // ( CurVox.k * N_DEXVOXRATIO + 0.5) * m_dStep) ; - //Point3d ptCubeSup( ( ( CurVox.i + 1) * N_DEXVOXRATIO + 0.5) * m_dStep, - // ( ( CurVox.j + 1) * N_DEXVOXRATIO + 0.5) * m_dStep, - // ( ( CurVox.k + 1) * N_DEXVOXRATIO + 0.5) * m_dStep) ; + //Point3d ptCubeInf( ( CurVox.i * m_nDexVoxRatio + 0.5) * m_dStep, + // ( CurVox.j * m_nDexVoxRatio + 0.5) * m_dStep, + // ( CurVox.k * m_nDexVoxRatio + 0.5) * m_dStep) ; + //Point3d ptCubeSup( ( ( CurVox.i + 1) * m_nDexVoxRatio + 0.5) * m_dStep, + // ( ( CurVox.j + 1) * m_nDexVoxRatio + 0.5) * m_dStep, + // ( ( CurVox.k + 1) * m_nDexVoxRatio + 0.5) * m_dStep) ; //double dU1, dU2 ; //if ( 1 - abs( vtStCurr * vtCurrEn ) < EPS_ZERO && // IntersLineBox( ptPLine, vtDLine, ptCubeInf, ptCubeSup, dU1, dU2)) { @@ -2585,16 +2585,16 @@ VolZmap::RegulateFeaturesChain( vector& vVecVox) const vtDLine = 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, - ( CurVox.k * N_DEXVOXRATIO + 0.5) * m_dStep) ; - Point3d ptCubeSup( ( ( CurVox.i + 1) * N_DEXVOXRATIO + 0.5) * m_dStep, - ( ( CurVox.j + 1) * N_DEXVOXRATIO + 0.5) * m_dStep, - ( ( CurVox.k + 1) * N_DEXVOXRATIO + 0.5) * m_dStep) ; + Point3d ptCubeInf( ( CurVox.i * m_nDexVoxRatio + 0.5) * m_dStep, + ( CurVox.j * m_nDexVoxRatio + 0.5) * m_dStep, + ( CurVox.k * m_nDexVoxRatio + 0.5) * m_dStep) ; + Point3d ptCubeSup( ( ( CurVox.i + 1) * m_nDexVoxRatio + 0.5) * m_dStep, + ( ( CurVox.j + 1) * m_nDexVoxRatio + 0.5) * m_dStep, + ( ( CurVox.k + 1) * m_nDexVoxRatio + 0.5) * m_dStep) ; 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 = ( dU1 + dU2) / 2 ; ptNew = ptPLine + dU * vtDLine ; } bool bNewInside = IsPointInsideVoxelApprox( CurVox.i, CurVox.j, CurVox.k, ptNew, 0) ; @@ -3172,7 +3172,7 @@ VolZmap::FlipEdgesII( int nBlock) const //---------------------------------------------------------------------------- bool -VolZmap::FlipEdgesBB() const +VolZmap::FlipEdgesBB( void) const { // Numero di blocchi int nBlocksNum = int( m_InterBlockSharpTria.size()) ; @@ -3367,9 +3367,9 @@ bool VolZmap::IsThereMat( int nI, int nJ, int nK) const { // Trasformo gli indici della griglia voxel in quelli della griglia dexel - nI *= N_DEXVOXRATIO ; - nJ *= N_DEXVOXRATIO ; - nK *= N_DEXVOXRATIO ; + nI *= m_nDexVoxRatio ; + nJ *= m_nDexVoxRatio ; + nK *= m_nDexVoxRatio ; // Se l'indice è alla frontiera del reticolo non vi è materiale if ( nI <= - 1 || nI >= int( m_nNx[0]) || @@ -3487,16 +3487,16 @@ VolZmap::IntersPos( int nVec1[], int nVec2[], bool bFirstCorner, AppliedVector& if ( nVec1[0] != nVec2[0]) { - int nMinI = min( nVec1[0], nVec2[0]) * N_DEXVOXRATIO ; - int nMaxI = max( nVec1[0], nVec2[0]) * N_DEXVOXRATIO ; + int nMinI = min( nVec1[0], nVec2[0]) * m_nDexVoxRatio ; + int nMaxI = max( nVec1[0], nVec2[0]) * m_nDexVoxRatio ; double dMinX = ( nMinI + 0.5) * m_dStep ; double dMaxX = ( nMaxI + 0.5) * m_dStep ; - vfField.ptPApp.y = ( nVec1[1] * N_DEXVOXRATIO + 0.5) * m_dStep ; - vfField.ptPApp.z = ( nVec1[2] * N_DEXVOXRATIO + 0.5) * m_dStep ; + vfField.ptPApp.y = ( nVec1[1] * m_nDexVoxRatio + 0.5) * m_dStep ; + vfField.ptPApp.z = ( nVec1[2] * m_nDexVoxRatio + 0.5) * m_dStep ; - int nDexel = ( nVec1[2] * m_nNx[1] + nVec1[1]) * N_DEXVOXRATIO ; + int nDexel = ( nVec1[2] * m_nNx[1] + nVec1[1]) * m_nDexVoxRatio ; int nSize = int( m_Values[1][nDexel].size()) ; if ( bFirstCorner) { @@ -3539,16 +3539,16 @@ VolZmap::IntersPos( int nVec1[], int nVec2[], bool bFirstCorner, AppliedVector& else if ( nVec1[1] != nVec2[1]) { - int nMinJ = min( nVec1[1], nVec2[1]) * N_DEXVOXRATIO ; - int nMaxJ = max( nVec1[1], nVec2[1]) * N_DEXVOXRATIO ; + int nMinJ = min( nVec1[1], nVec2[1]) * m_nDexVoxRatio ; + int nMaxJ = max( nVec1[1], nVec2[1]) * m_nDexVoxRatio ; double dMinY = ( nMinJ + 0.5) * m_dStep ; double dMaxY = ( nMaxJ + 0.5) * m_dStep ; - vfField.ptPApp.x = ( nVec1[0] * N_DEXVOXRATIO + 0.5) * m_dStep ; - vfField.ptPApp.z = ( nVec1[2] * N_DEXVOXRATIO + 0.5) * m_dStep ; + vfField.ptPApp.x = ( nVec1[0] * m_nDexVoxRatio + 0.5) * m_dStep ; + vfField.ptPApp.z = ( nVec1[2] * m_nDexVoxRatio + 0.5) * m_dStep ; - int nDexel = ( nVec1[0] * m_nNx[2] + nVec1[2]) * N_DEXVOXRATIO ; + int nDexel = ( nVec1[0] * m_nNx[2] + nVec1[2]) * m_nDexVoxRatio ; int nSize = int( m_Values[2][nDexel].size()) ; if ( bFirstCorner) { @@ -3591,16 +3591,16 @@ VolZmap::IntersPos( int nVec1[], int nVec2[], bool bFirstCorner, AppliedVector& else if ( nVec1[2] != nVec2[2]) { - int nMinK = min( nVec1[2], nVec2[2]) * N_DEXVOXRATIO ; - int nMaxK = max( nVec1[2], nVec2[2]) * N_DEXVOXRATIO ; + int nMinK = min( nVec1[2], nVec2[2]) * m_nDexVoxRatio ; + int nMaxK = max( nVec1[2], nVec2[2]) * m_nDexVoxRatio ; double dMinZ = ( nMinK + 0.5) * m_dStep ; double dMaxZ = ( nMaxK + 0.5) * m_dStep ; - vfField.ptPApp.x = ( nVec1[0] * N_DEXVOXRATIO + 0.5) * m_dStep ; - vfField.ptPApp.y = ( nVec1[1] * N_DEXVOXRATIO + 0.5) * m_dStep ; + vfField.ptPApp.x = ( nVec1[0] * m_nDexVoxRatio + 0.5) * m_dStep ; + vfField.ptPApp.y = ( nVec1[1] * m_nDexVoxRatio + 0.5) * m_dStep ; - int nDexel = ( nVec1[1] * m_nNx[0] + nVec1[0]) * N_DEXVOXRATIO ; + int nDexel = ( nVec1[1] * m_nNx[0] + nVec1[0]) * m_nDexVoxRatio ; int nSize = int( m_Values[0][nDexel].size()) ; if ( bFirstCorner) { @@ -3649,9 +3649,9 @@ bool VolZmap::IsValidVoxel( int nN) const { // Calcolo il numero di voxel lungo X,Y e Z - int nVoxNumX = m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2) ; - int nVoxNumY = m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2) ; - int nVoxNumZ = m_nNy[1] / N_DEXVOXRATIO + ( m_nNy[1] % N_DEXVOXRATIO == 0 ? 1 : 2) ; + int nVoxNumX = m_nNx[0] / m_nDexVoxRatio + ( m_nNx[0] % m_nDexVoxRatio == 0 ? 1 : 2) ; + int nVoxNumY = m_nNy[0] / m_nDexVoxRatio + ( m_nNy[0] % m_nDexVoxRatio == 0 ? 1 : 2) ; + int nVoxNumZ = m_nNy[1] / m_nDexVoxRatio + ( m_nNy[1] % m_nDexVoxRatio == 0 ? 1 : 2) ; // Verifico la validità del voxel return ( nN >= 0 && nN < ( nVoxNumX * nVoxNumY * nVoxNumZ)) ; } @@ -3661,9 +3661,9 @@ bool VolZmap::IsValidVoxel( int nI, int nJ, int nK) const { // Calcolo il numero di voxel lungo X,Y e Z - int nVoxNumX = int( m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumY = int( m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumZ = int( m_nNy[1] / N_DEXVOXRATIO + ( m_nNy[1] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; + int nVoxNumX = int( m_nNx[0] / m_nDexVoxRatio + ( m_nNx[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumY = int( m_nNy[0] / m_nDexVoxRatio + ( m_nNy[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumZ = int( m_nNy[1] / m_nDexVoxRatio + ( m_nNy[1] % m_nDexVoxRatio == 0 ? 1 : 2)) ; // Verifico la validità del voxel return ( nI >= -1 && nI <= nVoxNumX - 2 && nJ >= -1 && nJ <= nVoxNumY - 2 && @@ -3675,9 +3675,9 @@ bool VolZmap::GetVoxIJKFromN( int nN, int& nI, int& nJ, int& nK) const { // Calcolo il numero di voxel lungo X,Y e Z - int nVoxNumX = int( m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumY = int( m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumZ = int( m_nNy[1] / N_DEXVOXRATIO + ( m_nNy[1] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; + int nVoxNumX = int( m_nNx[0] / m_nDexVoxRatio + ( m_nNx[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumY = int( m_nNy[0] / m_nDexVoxRatio + ( m_nNy[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumZ = int( m_nNy[1] / m_nDexVoxRatio + ( m_nNy[1] % m_nDexVoxRatio == 0 ? 1 : 2)) ; // Controllo sulla validità del voxel if ( nN < 0 || nN >= nVoxNumX * nVoxNumY * nVoxNumZ) @@ -3699,9 +3699,9 @@ bool VolZmap::GetVoxNFromIJK( int nI, int nJ, int nK, int& nN) const { // Calcolo il numero di voxel lungo X,Y e Z - int nVoxNumX = int( m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumY = int( m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumZ = int( m_nNy[1] / N_DEXVOXRATIO + ( m_nNy[1] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; + int nVoxNumX = int( m_nNx[0] / m_nDexVoxRatio + ( m_nNx[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumY = int( m_nNy[0] / m_nDexVoxRatio + ( m_nNy[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumZ = int( m_nNy[1] / m_nDexVoxRatio + ( m_nNy[1] % m_nDexVoxRatio == 0 ? 1 : 2)) ; // Controllo la validità del voxel if ( nI < -1 || nI > nVoxNumX - 2 || @@ -3721,9 +3721,9 @@ bool VolZmap::GetVoxelBox( int nI, int nJ, int nK, BBox3d& b3VoxBox) const { // Calcolo il numero di voxel lungo X,Y e Z - int nVoxNumX = int( m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumY = int( m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumZ = int( m_nNy[1] / N_DEXVOXRATIO + ( m_nNy[1] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; + int nVoxNumX = int( m_nNx[0] / m_nDexVoxRatio + ( m_nNx[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumY = int( m_nNy[0] / m_nDexVoxRatio + ( m_nNy[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumZ = int( m_nNy[1] / m_nDexVoxRatio + ( m_nNy[1] % m_nDexVoxRatio == 0 ? 1 : 2)) ; // Controllo la validità del voxel if ( nI < -1 || nI > nVoxNumX - 2 || @@ -3732,12 +3732,12 @@ VolZmap::GetVoxelBox( int nI, int nJ, int nK, BBox3d& b3VoxBox) const return false ; // Punti della diagonale del voxel - Point3d ptCubeInf( ( nI * N_DEXVOXRATIO + 0.5) * m_dStep, - ( nJ * N_DEXVOXRATIO + 0.5) * m_dStep, - ( nK * N_DEXVOXRATIO + 0.5) * m_dStep) ; - Point3d ptCubeSup( ( ( nI + 1) * N_DEXVOXRATIO + 0.5) * m_dStep, - ( ( nJ + 1) * N_DEXVOXRATIO + 0.5) * m_dStep, - ( ( nK + 1) * N_DEXVOXRATIO + 0.5) * m_dStep) ; + Point3d ptCubeInf( ( nI * m_nDexVoxRatio + 0.5) * m_dStep, + ( nJ * m_nDexVoxRatio + 0.5) * m_dStep, + ( nK * m_nDexVoxRatio + 0.5) * m_dStep) ; + Point3d ptCubeSup( ( ( nI + 1) * m_nDexVoxRatio + 0.5) * m_dStep, + ( ( nJ + 1) * m_nDexVoxRatio + 0.5) * m_dStep, + ( ( nK + 1) * m_nDexVoxRatio + 0.5) * m_dStep) ; b3VoxBox.Set( ptCubeInf, ptCubeSup) ; return true ; } @@ -3785,9 +3785,9 @@ VolZmap::GetBlockLimitsIJK( const int nIJK[], int nLimits[]) const return false ; // Calcolo il numero di voxel lungo X,Y e Z - int nVoxNumX = int( m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumY = int( m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumZ = int( m_nNy[1] / N_DEXVOXRATIO + ( m_nNy[1] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; + int nVoxNumX = int( m_nNx[0] / m_nDexVoxRatio + ( m_nNx[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumY = int( m_nNy[0] / m_nDexVoxRatio + ( m_nNy[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumZ = int( m_nNy[1] / m_nDexVoxRatio + ( m_nNy[1] % m_nDexVoxRatio == 0 ? 1 : 2)) ; // Calcolo limiti per l'indice i nLimits[0] = ( nIJK[0] == 0 ? - 1 : nIJK[0] * m_nVoxNumPerBlock) ; @@ -3816,12 +3816,12 @@ VolZmap::GetBlockBox( const int nIJK[], BBox3d& b3VoxBox) const if ( ! GetBlockLimitsIJK( nIJK, nLimits)) return false ; // Costruisco il bounding-bx del blocco - Point3d ptMinDiag( ( nLimits[0] * N_DEXVOXRATIO + 0.5) * m_dStep, - ( nLimits[2] * N_DEXVOXRATIO + 0.5) * m_dStep, - ( nLimits[4] * N_DEXVOXRATIO + 0.5) * m_dStep) ; - Point3d ptMaxDiag( ( nLimits[1] * N_DEXVOXRATIO + 0.5) * m_dStep, - ( nLimits[3] * N_DEXVOXRATIO + 0.5) * m_dStep, - ( nLimits[5] * N_DEXVOXRATIO + 0.5) * m_dStep) ; + Point3d ptMinDiag( ( nLimits[0] * m_nDexVoxRatio + 0.5) * m_dStep, + ( nLimits[2] * m_nDexVoxRatio + 0.5) * m_dStep, + ( nLimits[4] * m_nDexVoxRatio + 0.5) * m_dStep) ; + Point3d ptMaxDiag( ( nLimits[1] * m_nDexVoxRatio + 0.5) * m_dStep, + ( nLimits[3] * m_nDexVoxRatio + 0.5) * m_dStep, + ( nLimits[5] * m_nDexVoxRatio + 0.5) * m_dStep) ; b3VoxBox.Set( ptMinDiag, ptMaxDiag) ; return true ; } @@ -3831,9 +3831,9 @@ bool VolZmap::IsPointInsideVoxelApprox( int nI, int nJ, int nK, const Point3d& ptP, double dPrec) const { // Calcolo il numero di voxel lungo X,Y e Z - int nVoxNumX = int( m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumY = int( m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumZ = int( m_nNy[1] / N_DEXVOXRATIO + ( m_nNy[1] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; + int nVoxNumX = int( m_nNx[0] / m_nDexVoxRatio + ( m_nNx[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumY = int( m_nNy[0] / m_nDexVoxRatio + ( m_nNy[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumZ = int( m_nNy[1] / m_nDexVoxRatio + ( m_nNy[1] % m_nDexVoxRatio == 0 ? 1 : 2)) ; // Controllo sulla validità del voxel if ( nI < -1 || nI > nVoxNumX - 2 || nJ < -1 || nJ > nVoxNumY - 2 || @@ -3843,12 +3843,12 @@ VolZmap::IsPointInsideVoxelApprox( int nI, int nJ, int nK, const Point3d& ptP, d if ( dPrec < EPS_ZERO) dPrec = 0 ; // Controllo che ogni coordinata stia dentro le relative limitazioni del voxel - bool bI = ptP.x > ( nI * N_DEXVOXRATIO + 0.5) * m_dStep - dPrec && - ptP.x < ( ( nI + 1) * N_DEXVOXRATIO + 0.5) * m_dStep + dPrec ; - bool bJ = ptP.y > ( nJ * N_DEXVOXRATIO + 0.5) * m_dStep - dPrec && - ptP.y < ( ( nJ + 1) * N_DEXVOXRATIO + 0.5) * m_dStep + dPrec ; - bool bK = ptP.z > ( nK * N_DEXVOXRATIO + 0.5) * m_dStep - dPrec && - ptP.z < ( ( nK + 1) * N_DEXVOXRATIO + 0.5) * m_dStep + dPrec ; + bool bI = ptP.x > ( nI * m_nDexVoxRatio + 0.5) * m_dStep - dPrec && + ptP.x < ( ( nI + 1) * m_nDexVoxRatio + 0.5) * m_dStep + dPrec ; + bool bJ = ptP.y > ( nJ * m_nDexVoxRatio + 0.5) * m_dStep - dPrec && + ptP.y < ( ( nJ + 1) * m_nDexVoxRatio + 0.5) * m_dStep + dPrec ; + bool bK = ptP.z > ( nK * m_nDexVoxRatio + 0.5) * m_dStep - dPrec && + ptP.z < ( ( nK + 1) * m_nDexVoxRatio + 0.5) * m_dStep + dPrec ; return ( bI && bJ && bK) ; } @@ -3858,13 +3858,13 @@ bool VolZmap::GetPointVoxel( const Point3d& ptP, int& nVoxI, int& nVoxJ, int& nVoxK) const { // Calcolo il numero di voxel lungo X,Y e Z - int nVoxNumX = int( m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumY = int( m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumZ = int( m_nNy[1] / N_DEXVOXRATIO + ( m_nNy[1] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; + int nVoxNumX = int( m_nNx[0] / m_nDexVoxRatio + ( m_nNx[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumY = int( m_nNy[0] / m_nDexVoxRatio + ( m_nNy[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumZ = int( m_nNy[1] / m_nDexVoxRatio + ( m_nNy[1] % m_nDexVoxRatio == 0 ? 1 : 2)) ; // Calcolo gli indici del voxel - nVoxI = int( floor( ( ptP.x - 0.5 * m_dStep) / ( m_dStep * N_DEXVOXRATIO))) ; - nVoxJ = int( floor( ( ptP.y - 0.5 * m_dStep) / ( m_dStep * N_DEXVOXRATIO))) ; - nVoxK = int( floor( ( ptP.z - 0.5 * m_dStep) / ( m_dStep * N_DEXVOXRATIO))) ; + nVoxI = int( floor( ( ptP.x - 0.5 * m_dStep) / ( m_dStep * m_nDexVoxRatio))) ; + nVoxJ = int( floor( ( ptP.y - 0.5 * m_dStep) / ( m_dStep * m_nDexVoxRatio))) ; + nVoxK = int( floor( ( ptP.z - 0.5 * m_dStep) / ( m_dStep * m_nDexVoxRatio))) ; // Controllo la validità del voxel return ( nVoxI >= - 1 && nVoxI <= nVoxNumX - 2 && nVoxJ >= - 1 && nVoxJ <= nVoxNumY - 2 && @@ -3876,9 +3876,9 @@ bool VolZmap::GetVoxelBlockIJK( const int nVoxIJK[], int nBlockIJK[]) const { // Calcolo il numero di voxel lungo X,Y e Z - int nVoxNumX = int( m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumY = int( m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumZ = int( m_nNy[1] / N_DEXVOXRATIO + ( m_nNy[1] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; + int nVoxNumX = int( m_nNx[0] / m_nDexVoxRatio + ( m_nNx[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumY = int( m_nNy[0] / m_nDexVoxRatio + ( m_nNy[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumZ = int( m_nNy[1] / m_nDexVoxRatio + ( m_nNy[1] % m_nDexVoxRatio == 0 ? 1 : 2)) ; // Controllo sull'ammissibilità del voxel if ( nVoxIJK[0] < -1 || nVoxIJK[0] > nVoxNumX - 2 || nVoxIJK[1] < -1 || nVoxIJK[1] > nVoxNumY - 2 || @@ -3932,9 +3932,9 @@ bool VolZmap::IsAVoxelOnBoundary( const int nLimits[], const int nIJK[], bool bType) const { // Calcolo il numero di voxel lungo X,Y e Z - int nVoxNumX = int( m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumY = int( m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumZ = int( m_nNy[1] / N_DEXVOXRATIO + ( m_nNy[1] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; + int nVoxNumX = int( m_nNx[0] / m_nDexVoxRatio + ( m_nNx[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumY = int( m_nNy[0] / m_nDexVoxRatio + ( m_nNy[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumZ = int( m_nNy[1] / m_nDexVoxRatio + ( m_nNy[1] % m_nDexVoxRatio == 0 ? 1 : 2)) ; // Test sulla validità dei limiti if ( nLimits[0] < -1 || nLimits[0] > nVoxNumX - 1 || @@ -3999,9 +3999,9 @@ bool VolZmap::IsAVoxelOnBoundary( const int nLimits[], const int nIJK[], int nDeltaIndex[]) const { // Calcolo il numero di voxel lungo X,Y e Z - int nVoxNumX = int( m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumY = int( m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nVoxNumZ = int( m_nNy[1] / N_DEXVOXRATIO + ( m_nNy[1] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; + int nVoxNumX = int( m_nNx[0] / m_nDexVoxRatio + ( m_nNx[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumY = int( m_nNy[0] / m_nDexVoxRatio + ( m_nNy[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nVoxNumZ = int( m_nNy[1] / m_nDexVoxRatio + ( m_nNy[1] % m_nDexVoxRatio == 0 ? 1 : 2)) ; // Test sulla validità dei limiti if ( nLimits[0] < -1 || nLimits[0] > nVoxNumX - 1 || nLimits[1] < -1 || nLimits[1] > nVoxNumX - 1 || @@ -4068,10 +4068,11 @@ VolZmap::GetFirstVoxIJK( int& i, int& j, int& k) const } if ( bNotEmpty) break ; - } - i = ni / N_DEXVOXRATIO - ( ni % N_DEXVOXRATIO) - 1 ; - j = nj / N_DEXVOXRATIO - ( nj % N_DEXVOXRATIO) - 1 ; - k = mj / N_DEXVOXRATIO - ( mj % N_DEXVOXRATIO) - 1 ; + } + + i = ( ni % m_nDexVoxRatio != 0 ? (ni + m_nDexVoxRatio - 1) / m_nDexVoxRatio - 1 : ni / m_nDexVoxRatio - 1) ; + j = ( nj % m_nDexVoxRatio != 0 ? (nj + m_nDexVoxRatio - 1) / m_nDexVoxRatio - 1 : nj / m_nDexVoxRatio - 1) ; + k = ( mj % m_nDexVoxRatio != 0 ? (mj + m_nDexVoxRatio - 1) / m_nDexVoxRatio - 1 : mj / m_nDexVoxRatio - 1) ; return true ; } @@ -4111,9 +4112,9 @@ VolZmap::GetLastVoxIJK( int& i, int& j, int& k) const if ( bNotEmpty) break ; } - i = ni / N_DEXVOXRATIO ; - j = nj / N_DEXVOXRATIO ; - k = mj / N_DEXVOXRATIO ; + i = ni / m_nDexVoxRatio ; + j = nj / m_nDexVoxRatio ; + k = mj / m_nDexVoxRatio ; return true ; } @@ -4155,13 +4156,13 @@ VolZmap::IsTriangleOnBorder( const Triangle3dEx& trTria, const int nBlockLimits[ // Verifico se tali punti sono sulla griglia for ( int nC = 0 ; nC < 3 ; ++ nC) { if ( nVoxIJK[nC] == nBlockLimits[2*nC]) { - double dGrid = ( nBlockLimits[2*nC] * N_DEXVOXRATIO + 0.5) * m_dStep ; + double dGrid = ( nBlockLimits[2*nC] * m_nDexVoxRatio + 0.5) * m_dStep ; if ( abs( ptFirstGrPt.v[nC] - dGrid) < EPS_SMALL && abs( ptSecondGrPt.v[nC] - dGrid) < EPS_SMALL) return true ; } if ( nVoxIJK[nC] + 1 == nBlockLimits[2*nC+1]) { - double dGrid = ( nBlockLimits[2*nC+1] * N_DEXVOXRATIO + 0.5) * m_dStep ; + double dGrid = ( nBlockLimits[2*nC+1] * m_nDexVoxRatio + 0.5) * m_dStep ; if ( abs( ptFirstGrPt.v[nC] - dGrid) < EPS_SMALL && abs( ptSecondGrPt.v[nC] - dGrid) < EPS_SMALL) return true ; @@ -4190,9 +4191,9 @@ VolZmap::CheckForFanNodeInterferance( AppliedVector BaseVecField[], Point3d& ptF ++ nNodeJ ; if ( n / 4 == 1) ++ nNodeK ; - Point3d ptNodeP( ( nNodeI * N_DEXVOXRATIO + 0.5) * m_dStep, - ( nNodeJ * N_DEXVOXRATIO + 0.5) * m_dStep, - ( nNodeK * N_DEXVOXRATIO + 0.5) * m_dStep) ; + Point3d ptNodeP( ( nNodeI * m_nDexVoxRatio + 0.5) * m_dStep, + ( nNodeJ * m_nDexVoxRatio + 0.5) * m_dStep, + ( nNodeK * m_nDexVoxRatio + 0.5) * m_dStep) ; for ( int nV = 0 ; nV < nBasePointNum ; ++ nV) { int nW = ( nV + 1) % nBasePointNum ; Plane3d plPlane ; @@ -4306,14 +4307,14 @@ VolZmap::ProcessVoxContXY( FlatVoxelContainer& VoxContXY, int nBlock, bool bPlus } } - Point3d ptT0( ( nMinI * N_DEXVOXRATIO + 0.5) * m_dStep, - ( nMinJ * N_DEXVOXRATIO + 0.5) * m_dStep, dCordZ) ; - Point3d ptT1( ( ( nMaxI + 1) * N_DEXVOXRATIO + 0.5) * m_dStep, - ( ( nMinJ * N_DEXVOXRATIO + 0.5) * m_dStep), dCordZ) ; - Point3d ptT2( ( ( nMaxI + 1) * N_DEXVOXRATIO + 0.5) * m_dStep, - ( ( ( nMaxJ + 1) * N_DEXVOXRATIO + 0.5) * m_dStep), dCordZ) ; - Point3d ptT3( ( nMinI * N_DEXVOXRATIO + 0.5) * m_dStep, - ( ( ( nMaxJ + 1) * N_DEXVOXRATIO + 0.5) * m_dStep), dCordZ) ; + Point3d ptT0( ( nMinI * m_nDexVoxRatio + 0.5) * m_dStep, + ( nMinJ * m_nDexVoxRatio + 0.5) * m_dStep, dCordZ) ; + Point3d ptT1( ( ( nMaxI + 1) * m_nDexVoxRatio + 0.5) * m_dStep, + ( ( nMinJ * m_nDexVoxRatio + 0.5) * m_dStep), dCordZ) ; + Point3d ptT2( ( ( nMaxI + 1) * m_nDexVoxRatio + 0.5) * m_dStep, + ( ( ( nMaxJ + 1) * m_nDexVoxRatio + 0.5) * m_dStep), dCordZ) ; + Point3d ptT3( ( nMinI * m_nDexVoxRatio + 0.5) * m_dStep, + ( ( ( nMaxJ + 1) * m_nDexVoxRatio + 0.5) * m_dStep), dCordZ) ; ptT0.ToGlob( m_MapFrame) ; ptT1.ToGlob( m_MapFrame) ; @@ -4426,14 +4427,14 @@ VolZmap::ProcessVoxContYZ( FlatVoxelContainer& VoxContYZ, int nBlock, bool bPlus } } - Point3d ptT0( dCordX, ( nMinJ * N_DEXVOXRATIO + 0.5) * m_dStep, - ( ( nMinK * N_DEXVOXRATIO + 0.5) * m_dStep)) ; - Point3d ptT1( dCordX, ( ( nMaxJ + 1) * N_DEXVOXRATIO + 0.5) * m_dStep, - ( ( nMinK * N_DEXVOXRATIO + 0.5) * m_dStep)) ; - Point3d ptT2( dCordX, ( ( nMaxJ + 1) * N_DEXVOXRATIO + 0.5) * m_dStep, - ( ( ( nMaxK + 1) * N_DEXVOXRATIO + 0.5) * m_dStep)) ; - Point3d ptT3( dCordX, ( nMinJ * N_DEXVOXRATIO + 0.5) * m_dStep, - ( ( ( nMaxK + 1) * N_DEXVOXRATIO + 0.5) * m_dStep)) ; + Point3d ptT0( dCordX, ( nMinJ * m_nDexVoxRatio + 0.5) * m_dStep, + ( ( nMinK * m_nDexVoxRatio + 0.5) * m_dStep)) ; + Point3d ptT1( dCordX, ( ( nMaxJ + 1) * m_nDexVoxRatio + 0.5) * m_dStep, + ( ( nMinK * m_nDexVoxRatio + 0.5) * m_dStep)) ; + Point3d ptT2( dCordX, ( ( nMaxJ + 1) * m_nDexVoxRatio + 0.5) * m_dStep, + ( ( ( nMaxK + 1) * m_nDexVoxRatio + 0.5) * m_dStep)) ; + Point3d ptT3( dCordX, ( nMinJ * m_nDexVoxRatio + 0.5) * m_dStep, + ( ( ( nMaxK + 1) * m_nDexVoxRatio + 0.5) * m_dStep)) ; ptT0.ToGlob( m_MapFrame) ; ptT1.ToGlob( m_MapFrame) ; @@ -4546,14 +4547,14 @@ VolZmap::ProcessVoxContXZ( FlatVoxelContainer& VoxContXZ, int nBlock, bool bPlus } } - Point3d ptT0( ( nMinI * N_DEXVOXRATIO + 0.5) * m_dStep, dCordY, - ( ( nMinK * N_DEXVOXRATIO + 0.5) * m_dStep)) ; - Point3d ptT1( ( ( nMaxI + 1) * N_DEXVOXRATIO + 0.5) * m_dStep, dCordY, - ( ( nMinK * N_DEXVOXRATIO + 0.5) * m_dStep)) ; - Point3d ptT2( ( ( nMaxI + 1) * N_DEXVOXRATIO + 0.5) * m_dStep, dCordY, - ( ( ( nMaxK + 1) * N_DEXVOXRATIO + 0.5) * m_dStep)) ; - Point3d ptT3( ( nMinI * N_DEXVOXRATIO + 0.5) * m_dStep, dCordY, - ( ( ( nMaxK + 1) * N_DEXVOXRATIO + 0.5) * m_dStep)) ; + Point3d ptT0( ( nMinI * m_nDexVoxRatio + 0.5) * m_dStep, dCordY, + ( ( nMinK * m_nDexVoxRatio + 0.5) * m_dStep)) ; + Point3d ptT1( ( ( nMaxI + 1) * m_nDexVoxRatio + 0.5) * m_dStep, dCordY, + ( ( nMinK * m_nDexVoxRatio + 0.5) * m_dStep)) ; + Point3d ptT2( ( ( nMaxI + 1) * m_nDexVoxRatio + 0.5) * m_dStep, dCordY, + ( ( ( nMaxK + 1) * m_nDexVoxRatio + 0.5) * m_dStep)) ; + Point3d ptT3( ( nMinI * m_nDexVoxRatio + 0.5) * m_dStep, dCordY, + ( ( ( nMaxK + 1) * m_nDexVoxRatio + 0.5) * m_dStep)) ; ptT0.ToGlob( m_MapFrame) ; ptT1.ToGlob( m_MapFrame) ; diff --git a/VolZmapVolume.cpp b/VolZmapVolume.cpp index 6b111e8..48c04f4 100644 --- a/VolZmapVolume.cpp +++ b/VolZmapVolume.cpp @@ -136,8 +136,8 @@ VolZmap::SubtractIntervals( int nGrid, int nI, int nJ, m_nConnectedCompoCount = - 1 ; // Passo da indici di dexel a indici di voxel - nI /= N_DEXVOXRATIO ; - nJ /= N_DEXVOXRATIO ; + nI /= m_nDexVoxRatio ; + nJ /= m_nDexVoxRatio ; // Determino quali blocchi sono stati modificati if ( nGrid == 0) { @@ -158,9 +158,9 @@ VolZmap::SubtractIntervals( int nGrid, int nI, int nJ, ++ nYStop ; } // Voxel lungo Z - int nVoxNumZ = int( m_nNy[1] / N_DEXVOXRATIO + ( m_nNy[1] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nMinK = Clamp( int( floor( ( ( dMin - 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) - EPS_SMALL))), 0, nVoxNumZ - 2) ; - int nMaxK = Clamp( int( floor( ( ( dMax + 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) + EPS_SMALL))), 0, nVoxNumZ - 2) ; + int nVoxNumZ = int( m_nNy[1] / m_nDexVoxRatio + ( m_nNy[1] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nMinK = Clamp( int( floor( ( ( dMin - 0.5 * m_dStep) / ( m_nDexVoxRatio * m_dStep) - EPS_SMALL))), 0, nVoxNumZ - 2) ; + int nMaxK = Clamp( int( floor( ( ( dMax + 0.5 * m_dStep) / ( m_nDexVoxRatio * m_dStep) + EPS_SMALL))), 0, nVoxNumZ - 2) ; int nMinZBlock = ( m_nMapNum == 1 ? 0 : Clamp( nMinK / int( m_nVoxNumPerBlock), 0, int( m_nFracLin[2] - 1))) ; int nMaxZBlock = min( int( m_nFracLin[2] - 1), nMaxK / int( m_nVoxNumPerBlock)) ; // Assegno flag ai voxel @@ -192,9 +192,9 @@ VolZmap::SubtractIntervals( int nGrid, int nI, int nJ, ++ nZStop ; } // Voxel lungo X - int nVoxNumX = int( m_nNx[0] / N_DEXVOXRATIO + ( m_nNx[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nMinI = Clamp( int( floor( ( ( dMin - 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) - EPS_SMALL))), 0, nVoxNumX - 2) ; - int nMaxI = Clamp( int( floor( ( ( dMax + 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) + EPS_SMALL))), 0, nVoxNumX - 2) ; + int nVoxNumX = int( m_nNx[0] / m_nDexVoxRatio + ( m_nNx[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nMinI = Clamp( int( floor( ( ( dMin - 0.5 * m_dStep) / ( m_nDexVoxRatio * m_dStep) - EPS_SMALL))), 0, nVoxNumX - 2) ; + int nMaxI = Clamp( int( floor( ( ( dMax + 0.5 * m_dStep) / ( m_nDexVoxRatio * m_dStep) + EPS_SMALL))), 0, nVoxNumX - 2) ; int nMinXBlock = Clamp( nMinI / int( m_nVoxNumPerBlock), 0, int( m_nFracLin[0] - 1)) ; int nMaxXBlock = min( int( m_nFracLin[0] - 1), nMaxI / int( m_nVoxNumPerBlock)) ; // Assegno flag ai voxel @@ -226,9 +226,9 @@ VolZmap::SubtractIntervals( int nGrid, int nI, int nJ, ++ nZStop ; } // Voxel lungo Y - int nVoxNumY = int( m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; - int nMinJ = Clamp( int( floor( ( ( dMin - 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) - EPS_SMALL))), 0, nVoxNumY - 2) ; - int nMaxJ = Clamp( int( floor( ( ( dMax + 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) + EPS_SMALL))), 0, nVoxNumY - 2) ; + int nVoxNumY = int( m_nNy[0] / m_nDexVoxRatio + ( m_nNy[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ; + int nMinJ = Clamp( int( floor( ( ( dMin - 0.5 * m_dStep) / ( m_nDexVoxRatio * m_dStep) - EPS_SMALL))), 0, nVoxNumY - 2) ; + int nMaxJ = Clamp( int( floor( ( ( dMax + 0.5 * m_dStep) / ( m_nDexVoxRatio * m_dStep) + EPS_SMALL))), 0, nVoxNumY - 2) ; int nMinYBlock = Clamp( nMinJ / int( m_nVoxNumPerBlock), 0, int( m_nFracLin[1] - 1)) ; int nMaxYBlock = min( int( m_nFracLin[1] - 1), nMaxJ / int( m_nVoxNumPerBlock)) ; // Assegno flag ai voxel