EgtGeomKernel 1.9c1 :
- migliorie varie a Zmap.
This commit is contained in:
+158
@@ -18,6 +18,7 @@
|
||||
#include "NgeWriter.h"
|
||||
#include "NgeReader.h"
|
||||
#include "GeoConst.h"
|
||||
#include "/EgtDev/Include/EgtNumUtils.h"
|
||||
#include "/EgtDev/Include/EGkUiUnits.h"
|
||||
#include "/EgtDev/Include/EGkIntervals.h"
|
||||
#include "/EgtDev/Include/EGkStringUtils3d.h"
|
||||
@@ -1121,6 +1122,7 @@ VolZmap::RemovePart( int nPart)
|
||||
for ( int nInt = 0 ; nInt < int( m_Values[nMap][nDex].size()) ; ++ nInt) {
|
||||
// Se l'intervallo appartiene alla componente da eliminare, lo cancello.
|
||||
if ( m_Values[nMap][nDex][nInt].nCompo == nPart + 1) {
|
||||
SetToModifyDexelBlocks( nMap, nDex, nInt) ;
|
||||
m_Values[nMap][nDex].erase( m_Values[nMap][nDex].begin() + nInt) ;
|
||||
-- nInt ;
|
||||
}
|
||||
@@ -1139,6 +1141,162 @@ VolZmap::RemovePart( int nPart)
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
VolZmap::SetToModifyDexelBlocks( int nGrid, int nDex, int nInt)
|
||||
{
|
||||
// Controllo sulla validità della griglia
|
||||
if ( nGrid < 0 || nGrid > 2)
|
||||
return false ;
|
||||
// Controllo sulla validità del dexel
|
||||
if ( nDex <= - 1 || nDex >= int( m_Values[nGrid].size()))
|
||||
return false ;
|
||||
// Controllo sulla validità dell'intervallo
|
||||
if ( nInt <= - 1 || nInt >= int( m_Values[nGrid][nDex].size()))
|
||||
return false ;
|
||||
|
||||
|
||||
// Determino quali blocchi sono stati modificati
|
||||
int nLayerBlock = m_nFracLin[0] * m_nFracLin[1] ;
|
||||
// Indici del dexel
|
||||
int nI = nDex % m_nNx[nGrid] ;
|
||||
int nJ = nDex / m_nNx[nGrid] ;
|
||||
// Quote estreme del dexel
|
||||
double dMin = m_Values[nGrid][nDex][nInt].dMin ;
|
||||
double dMax = m_Values[nGrid][nDex][nInt].dMax ;
|
||||
|
||||
if ( nGrid == 0) {
|
||||
|
||||
int nXStop = 1 ;
|
||||
int nYStop = 1 ;
|
||||
|
||||
int nXBlock[2] ;
|
||||
int nYBlock[2] ;
|
||||
|
||||
// Passo dal dexel al voxel
|
||||
nI /= N_DEXVOXRATIO ;
|
||||
nJ /= N_DEXVOXRATIO ;
|
||||
|
||||
nXBlock[0] = min( nI / m_nVoxNumPerBlock, m_nFracLin[0] - 1) ;
|
||||
nYBlock[0] = min( nJ / m_nVoxNumPerBlock, m_nFracLin[1] - 1) ;
|
||||
|
||||
if ( nI % N_VOXBLOCK == 0 && nXBlock[0] > 0) {
|
||||
nXBlock[1] = nXBlock[0] - 1 ;
|
||||
++ nXStop ;
|
||||
}
|
||||
|
||||
if ( nJ % N_VOXBLOCK == 0 && nYBlock[0] > 0) {
|
||||
nYBlock[1] = nYBlock[0] - 1 ;
|
||||
++ nYStop ;
|
||||
}
|
||||
|
||||
// Numero di 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 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)) ;
|
||||
|
||||
for ( int tI = 0 ; tI < nXStop ; ++ tI) {
|
||||
for ( int tJ = 0 ; tJ < nYStop ; ++ tJ) {
|
||||
for ( int k = nMinZBlock ; k <= nMaxZBlock ; ++ k) {
|
||||
int nBlockNum = k * nLayerBlock + nYBlock[tJ] * m_nFracLin[0] + nXBlock[tI] ;
|
||||
m_BlockToUpdate[nBlockNum] = true ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( nGrid == 1) {
|
||||
|
||||
int nYStop = 1 ;
|
||||
int nZStop = 1 ;
|
||||
|
||||
int nYBlock[2] ;
|
||||
int nZBlock[2] ;
|
||||
|
||||
// Passo dal dexel al voxel
|
||||
nI /= N_DEXVOXRATIO ;
|
||||
nJ /= N_DEXVOXRATIO ;
|
||||
|
||||
nYBlock[0] = min( nI / m_nVoxNumPerBlock, m_nFracLin[1] - 1) ;
|
||||
nZBlock[0] = min( nJ / m_nVoxNumPerBlock, m_nFracLin[2] - 1) ;
|
||||
|
||||
if ( nI % N_VOXBLOCK == 0 && nYBlock[0] > 0) {
|
||||
nYBlock[1] = nYBlock[0] - 1 ;
|
||||
++ nYStop ;
|
||||
}
|
||||
|
||||
if ( nJ % N_VOXBLOCK == 0 && nZBlock[0] > 0) {
|
||||
nZBlock[1] = nZBlock[0] - 1 ;
|
||||
++ nZStop ;
|
||||
}
|
||||
|
||||
// Numero di 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 nMinXBlock = Clamp( nMinI / int( m_nVoxNumPerBlock), 0, int( m_nFracLin[0] - 1)) ;
|
||||
int nMaxXBlock = min( int( m_nFracLin[0] - 1), nMaxI / int( m_nVoxNumPerBlock)) ;
|
||||
|
||||
for ( int tI = 0 ; tI < nYStop ; ++ tI) {
|
||||
for ( int tJ = 0 ; tJ < nZStop ; ++ tJ) {
|
||||
for ( int k = nMinXBlock ; k <= nMaxXBlock ; ++ k) {
|
||||
int nBlockNum = nZBlock[tJ] * nLayerBlock + nYBlock[tI] * m_nFracLin[0] + k ;
|
||||
m_BlockToUpdate[nBlockNum] = true ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( nGrid == 2) {
|
||||
|
||||
int nXStop = 1 ;
|
||||
int nZStop = 1 ;
|
||||
|
||||
int nXBlock[2] ;
|
||||
int nZBlock[2] ;
|
||||
|
||||
// Passo dal dexel al voxel
|
||||
nI /= N_DEXVOXRATIO ;
|
||||
nJ /= N_DEXVOXRATIO ;
|
||||
|
||||
nXBlock[0] = min( nJ / m_nVoxNumPerBlock, m_nFracLin[0] - 1) ;
|
||||
nZBlock[0] = min( nI / m_nVoxNumPerBlock, m_nFracLin[2] - 1) ;
|
||||
|
||||
if ( nJ % N_VOXBLOCK == 0 && nXBlock[0] > 0) {
|
||||
nXBlock[1] = nXBlock[0] - 1 ;
|
||||
++ nXStop ;
|
||||
}
|
||||
|
||||
if ( nI % N_VOXBLOCK == 0 && nZBlock[0] > 0) {
|
||||
nZBlock[1] = nZBlock[0] - 1 ;
|
||||
++ nZStop ;
|
||||
}
|
||||
|
||||
// Numero di 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 nMinYBlock = Clamp( nMinJ / int( m_nVoxNumPerBlock), 0, int( m_nFracLin[1] - 1)) ;
|
||||
int nMaxYBlock = min( int( m_nFracLin[1] - 1), nMaxJ / int( m_nVoxNumPerBlock)) ;
|
||||
|
||||
for ( int tI = 0 ; tI < nZStop ; ++ tI) {
|
||||
for ( int tJ = 0 ; tJ < nXStop ; ++ tJ) {
|
||||
for ( int k = nMinYBlock ; k <= nMaxYBlock ; ++ k) {
|
||||
int nBlockNum = nZBlock[tI] * nLayerBlock + k * m_nFracLin[0] + nXBlock[tJ] ;
|
||||
m_BlockToUpdate[nBlockNum] = true ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
VolZmap::SetTolerances( double dLinTol, double dAngTolDeg)
|
||||
|
||||
Reference in New Issue
Block a user