EgtGeomKernel :
- codice di test per Zmap.
This commit is contained in:
+354
-231
@@ -132,10 +132,10 @@ VolZmap::SubtractIntervals( int nGrid, int nI, int nJ,
|
||||
|
||||
// Imposto ricalcolo della grafica
|
||||
m_OGrMgr.Reset() ;
|
||||
// Imposto forma generica
|
||||
m_nShape = GENERIC ;
|
||||
// Imposto forma generica
|
||||
m_nShape = GENERIC ;
|
||||
// Imposto ricalcolo numero di componenti connesse
|
||||
m_nConnectedCompoCount = - 1 ;
|
||||
m_nConnectedCompoCount = - 1 ;
|
||||
|
||||
// Passo da indici di dexel a indici di voxel
|
||||
nI /= m_nDexVoxRatio ;
|
||||
@@ -160,7 +160,7 @@ VolZmap::SubtractIntervals( int nGrid, int nI, int nJ,
|
||||
++ nYStop ;
|
||||
}
|
||||
// Voxel lungo Z
|
||||
int nVoxNumZ = int( m_nNy[1] / m_nDexVoxRatio + ( m_nNy[1] % m_nDexVoxRatio == 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) / ( 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))) ;
|
||||
@@ -227,8 +227,8 @@ VolZmap::SubtractIntervals( int nGrid, int nI, int nJ,
|
||||
nZBlock[1] = nZBlock[0] - 1 ;
|
||||
++ nZStop ;
|
||||
}
|
||||
// Voxel lungo Y
|
||||
int nVoxNumY = int( m_nNy[0] / m_nDexVoxRatio + ( m_nNy[0] % m_nDexVoxRatio == 0 ? 1 : 2)) ;
|
||||
// Voxel lungo Y
|
||||
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)) ;
|
||||
@@ -249,232 +249,355 @@ VolZmap::SubtractIntervals( int nGrid, int nI, int nJ,
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
VolZmap::AddIntervals( int nGrid, int nI, int nJ,
|
||||
double dMin, double dMax, const Vector3d& vtNMin, const Vector3d& vtNMax, int nToolNum)
|
||||
VolZmap::AddIntervals( int nGrid, int nI, int nJ, double dMin, double dMax, const Vector3d& vtNMin,
|
||||
const Vector3d& vtNMax, int nToolNum)
|
||||
{
|
||||
// // Controllo che dMin e dMax non siano quasi coincidenti
|
||||
// if ( abs( dMax - dMin) < EPS_SMALL)
|
||||
// return true ;
|
||||
//
|
||||
// // Controllo che il numero di griglia sia entro i limiti
|
||||
// if ( nGrid < 0 || nGrid > 2)
|
||||
// return false ;
|
||||
//
|
||||
// // Controllo che dMin < dMax
|
||||
// if ( dMin > dMax)
|
||||
// swap( dMin, dMax) ;
|
||||
//
|
||||
// // Controllo che indici nI, nJ siano entro i limiti
|
||||
// if ( nI < 0 && nI >= m_nNx[nGrid] &&
|
||||
// nJ < 0 && nJ >= m_nNy[nGrid])
|
||||
// return false ;
|
||||
//
|
||||
// // Riporto le coordinate cicliche nell'ordine di partenza
|
||||
// Vector3d vtNmi = vtNMin ;
|
||||
// Vector3d vtNma = vtNMax ;
|
||||
// if ( nGrid == 1) {
|
||||
// swap( vtNmi.x, vtNmi.z) ;
|
||||
// swap( vtNmi.y, vtNmi.z) ;
|
||||
// swap( vtNma.x, vtNma.z) ;
|
||||
// swap( vtNma.y, vtNma.z) ;
|
||||
// }
|
||||
// else if ( nGrid == 2) {
|
||||
// swap( vtNmi.y, vtNmi.z) ;
|
||||
// swap( vtNmi.x, vtNmi.z) ;
|
||||
// swap( vtNma.y, vtNma.z) ;
|
||||
// swap( vtNma.x, vtNma.z) ;
|
||||
// }
|
||||
//
|
||||
// // Calcolo nPos
|
||||
// unsigned int nPos = nJ * m_nNx[nGrid] + nI ;
|
||||
//
|
||||
//
|
||||
// // Se spillone vuoto
|
||||
// if ( m_Values[nGrid][nPos].size() == 0) {
|
||||
//
|
||||
// m_Values[nGrid][nPos].resize( 1) ;
|
||||
//
|
||||
// m_Values[nGrid][nPos][0].dMin = dMin ;
|
||||
// m_Values[nGrid][nPos][0].dMax = dMax ;
|
||||
//
|
||||
// m_Values[nGrid][nPos][0].vtMinN = vtNmi ;
|
||||
// m_Values[nGrid][nPos][0].vtMaxN = vtNma ;
|
||||
//
|
||||
// if ( dMax > m_dMaxZ[nGrid])
|
||||
// m_dMinZ[nGrid] = dMax ;
|
||||
//
|
||||
// if ( dMin < m_dMinZ[nGrid])
|
||||
// m_dMinZ[nGrid] = dMin ;
|
||||
//
|
||||
// m_OGrMgr.Reset() ;
|
||||
//
|
||||
// return true ;
|
||||
// }
|
||||
//
|
||||
// // Ciclo sugli intervalli dello spillone
|
||||
// bool bModified = false ;
|
||||
// unsigned int i = 0 ;
|
||||
// while ( i < m_Values[nGrid][nPos].size()) {
|
||||
//
|
||||
// // Eventuale aggiustamento di intervalli sovrapposti
|
||||
// if ( i < m_Values[nGrid][nPos].size() - 1) {
|
||||
// if ( m_Values[nGrid][nPos][i].dMax > m_Values[nGrid][nPos][i + 1].dMin - EPS_SMALL) {
|
||||
//
|
||||
// // Se l'intervallo corrente non è contenuto totalmente si esegue l'istruzione successiva
|
||||
// if ( m_Values[nGrid][nPos][i].dMin < m_Values[nGrid][nPos][i + 1].dMin + EPS_SMALL) {
|
||||
//
|
||||
// m_Values[nGrid][nPos][i].dMax = m_Values[nGrid][nPos][i + 1].dMax ;
|
||||
// m_Values[nGrid][nPos][i].vtMaxN = m_Values[nGrid][nPos][i + 1].vtMaxN ;
|
||||
// }
|
||||
// // altrimenti
|
||||
// else {
|
||||
//
|
||||
// m_Values[nGrid][nPos][i].dMin = m_Values[nGrid][nPos][i].dMin ;
|
||||
// m_Values[nGrid][nPos][i].vtMinN = m_Values[nGrid][nPos][i].vtMinN ;
|
||||
//
|
||||
// m_Values[nGrid][nPos][i].dMax = m_Values[nGrid][nPos][i].dMax ;
|
||||
// m_Values[nGrid][nPos][i].vtMaxN = m_Values[nGrid][nPos][i].vtMaxN ;
|
||||
// }
|
||||
//
|
||||
// for ( unsigned int j = i + 1 ; j < m_Values[nGrid][nPos].size() - 1 ; ++ j) {
|
||||
//
|
||||
// m_Values[nGrid][nPos][j].dMin = m_Values[nGrid][nPos][j + 1].dMin ;
|
||||
// m_Values[nGrid][nPos][j].vtMinN = m_Values[nGrid][nPos][j + 1].vtMinN ;
|
||||
//
|
||||
// m_Values[nGrid][nPos][j].dMax = m_Values[nGrid][nPos][j + 1].dMax ;
|
||||
// m_Values[nGrid][nPos][j].vtMaxN = m_Values[nGrid][nPos][j + 1].vtMaxN ;
|
||||
// }
|
||||
//
|
||||
// m_Values[nGrid][nPos].resize( m_Values[nGrid][nPos].size() - 1) ;
|
||||
//
|
||||
// i = i - 1 ;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//
|
||||
// // Caso in cui devo aggiungere un intervallo a sinistra dell'intervallo corrente
|
||||
// if ( m_Values[nGrid][nPos][i].dZVal > dMax + EPS_SMALL) {
|
||||
//
|
||||
// bModified = true ;
|
||||
//
|
||||
// m_Values[nGrid][nPos].resize( m_Values[nGrid][nPos].size() + 2) ;
|
||||
//
|
||||
// for ( size_t j = m_Values[nGrid][nPos].size() - 1 ; j >= i + 2 ; -- j) {
|
||||
//
|
||||
// m_Values[nGrid][nPos][j].dZVal = m_Values[nGrid][nPos][j - 2].dZVal ;
|
||||
// m_Values[nGrid][nPos][j].vtN = m_Values[nGrid][nPos][j - 2].vtN ;
|
||||
// }
|
||||
//
|
||||
//
|
||||
// m_Values[nGrid][nPos][i].dZVal = dMin ;
|
||||
// m_Values[nGrid][nPos][i + 1].dZVal = dMax ;
|
||||
//
|
||||
// m_Values[nGrid][nPos][i].vtN = vtNMin ;
|
||||
// m_Values[nGrid][nPos][i + 1].vtN = vtNMax ;
|
||||
//
|
||||
// i = i + 2 ;
|
||||
// }
|
||||
//
|
||||
// // Casi d'intersezione:
|
||||
// else if ( m_Values[nGrid][nPos][i + 1].dZVal > dMax - EPS_SMALL) {
|
||||
//
|
||||
// // Se l'intervallo da aggiungere sconfina a sinistra modifico il minimo dell'intervalo corrente
|
||||
// if ( m_Values[nGrid][nPos][i].dZVal > dMin - EPS_SMALL) {
|
||||
//
|
||||
// bModified = true ;
|
||||
// m_Values[nGrid][nPos][i].dZVal = dMin ;
|
||||
// m_Values[nGrid][nPos][i].vtN = vtNmi ;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// else {
|
||||
// // Se l'intervallo corrente è tutto contenuto nell'intervallo da aggungere modifico gli estremi
|
||||
// if ( m_Values[nGrid][nPos][i].dZVal > dMin + EPS_SMALL) {
|
||||
//
|
||||
// bModified = true ;
|
||||
// m_Values[nGrid][nPos][i].dZVal = dMin ;
|
||||
// m_Values[nGrid][nPos][i + 1].dZVal = dMax ;
|
||||
// m_Values[nGrid][nPos][i].vtN = vtNMin ;
|
||||
// m_Values[nGrid][nPos][i + 1].vtN = vtNma ;
|
||||
// }
|
||||
// // Se l'intervallo da aggiungere sconfina a destra modifico il massimo dell'intervallo corrente
|
||||
// else if ( m_Values[nGrid][nPos][i + 1].dZVal > dMin - EPS_SMALL) {
|
||||
//
|
||||
// bModified = true ;
|
||||
// m_Values[nGrid][nPos][i + 1].dZVal = dMax ;
|
||||
// m_Values[nGrid][nPos][i + 1].vtN = vtNma ;
|
||||
// }
|
||||
// else {
|
||||
// // Aggiungo intervallo a destra dell'ultimo intervallo
|
||||
// if ( i == m_Values[nGrid][nPos].size() - 2) {
|
||||
//
|
||||
// bModified = true ;
|
||||
// m_Values[nGrid][nPos].resize( m_Values[nGrid][nPos].size() + 2) ;
|
||||
//
|
||||
// m_Values[nGrid][nPos][i + 2].dZVal = dMin ;
|
||||
// m_Values[nGrid][nPos][i + 3].dZVal = dMax ;
|
||||
// m_Values[nGrid][nPos][i + 2].vtN = vtNmi ;
|
||||
// m_Values[nGrid][nPos][i + 3].vtN = vtNma ;
|
||||
//
|
||||
// i = i + 2 ;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// i = i + 2 ;
|
||||
// }
|
||||
//
|
||||
// // se eseguita modifica, imposto ricalcolo della grafica
|
||||
// if ( bModified) {
|
||||
//
|
||||
// // Determino quali blocchi sono stati modificati
|
||||
// int nLayerBlock = m_nFracLin[0] * m_nFracLin[1] ;
|
||||
//
|
||||
// if ( nGrid == 0) {
|
||||
//
|
||||
// int nXBlock = min( nI / m_nDexNumPBlock, m_nFracLin[0] - 1) ;
|
||||
// int nYBlock = min( nJ / m_nDexNumPBlock, m_nFracLin[1] - 1) ;
|
||||
// int nMinZBlock = max( 0, int( floor( ( dMin / m_dStep))) / int( m_nDexNumPBlock)) ;
|
||||
// int nMaxZBlock = min( int( m_nFracLin[2] - 1), int( floor( ( dMax / m_dStep))) / int( m_nDexNumPBlock)) ;
|
||||
//
|
||||
// for ( int k = nMinZBlock ; k <= nMaxZBlock ; ++ k)
|
||||
//
|
||||
// m_BlockToUpdate[k * nLayerBlock + nYBlock * m_nFracLin[0] + nXBlock] = true ;
|
||||
// }
|
||||
// else if ( nGrid == 1) {
|
||||
//
|
||||
// int nYBlock = min( nI / m_nDexNumPBlock, m_nFracLin[1] - 1) ;
|
||||
// int nZBlock = min( nJ / m_nDexNumPBlock, m_nFracLin[2] - 1) ;
|
||||
// int nMinXBlock = max( 0, int( floor( ( dMin / m_dStep))) / int( m_nDexNumPBlock)) ;
|
||||
// int nMaxXBlock = min( int( m_nFracLin[0] - 1), int( floor( ( dMax / m_dStep))) / int( m_nDexNumPBlock)) ;
|
||||
//
|
||||
// for ( int k = nMinXBlock ; k <= nMaxXBlock ; ++ k)
|
||||
//
|
||||
// m_BlockToUpdate[nZBlock * nLayerBlock + nYBlock * m_nFracLin[0] + k] = true ;
|
||||
// }
|
||||
// else if ( nGrid == 2) {
|
||||
//
|
||||
// int nXBlock = min( nJ / m_nDexNumPBlock, m_nFracLin[0] - 1) ;
|
||||
// int nZBlock = min( nI / m_nDexNumPBlock, m_nFracLin[2] - 1) ;
|
||||
// int nMinYBlock = max( 0, int( floor( ( dMin / m_dStep))) / int( m_nDexNumPBlock)) ;
|
||||
// int nMaxYBlock = min( int( m_nFracLin[1] - 1), int( floor( ( dMax / m_dStep))) / int( m_nDexNumPBlock)) ;
|
||||
//
|
||||
// for ( int k = nMinYBlock ; k <= nMaxYBlock ; ++ k)
|
||||
//
|
||||
// m_BlockToUpdate[nZBlock * nLayerBlock + k * m_nFracLin[0] + nXBlock] = true ;
|
||||
// }
|
||||
//
|
||||
// m_OGrMgr.Reset() ;
|
||||
//
|
||||
// // Aggiorno massima e minima Z
|
||||
// // sullo Zmap
|
||||
// if ( dMax > m_dMaxZ[nGrid])
|
||||
// m_dMinZ[nGrid] = dMax ;
|
||||
//
|
||||
// if ( dMin < m_dMinZ[nGrid])
|
||||
// m_dMinZ[nGrid] = dMin ;
|
||||
// }
|
||||
//
|
||||
// Controllo che il numero di griglia sia entro i limiti
|
||||
if ( nGrid < 0 || nGrid > 2)
|
||||
return false ;
|
||||
|
||||
// Controllo che indici nI, nJ siano entro i limiti
|
||||
if ( nI < 0 && nI >= m_nNx[nGrid] && nJ < 0 && nJ >= m_nNy[nGrid])
|
||||
return false ;
|
||||
|
||||
// Controllo che dMin < dMax ( nel caso swap parametri e vettori )
|
||||
Vector3d vtNmi = vtNMin ;
|
||||
Vector3d vtNma = vtNMax ;
|
||||
if ( dMin > dMax) {
|
||||
swap( dMin, dMax) ;
|
||||
swap( vtNmi, vtNma) ;
|
||||
}
|
||||
|
||||
// Restringo minimo e massimo entro i limiti della mappa
|
||||
if ( dMin < m_dMinZ[nGrid]) {
|
||||
dMin = m_dMinZ[nGrid] ;
|
||||
vtNmi = - Z_AX ;
|
||||
}
|
||||
else if ( dMin > m_dMaxZ[nGrid]) {
|
||||
dMin = m_dMaxZ[nGrid] ;
|
||||
vtNmi = - Z_AX ;
|
||||
}
|
||||
if ( dMax < m_dMinZ[nGrid]) {
|
||||
dMax = m_dMinZ[nGrid] ;
|
||||
vtNma = Z_AX ;
|
||||
}
|
||||
else if ( dMax > m_dMaxZ[nGrid]) {
|
||||
dMax = m_dMaxZ[nGrid] ;
|
||||
vtNma = Z_AX ;
|
||||
}
|
||||
|
||||
// Controllo che dMin e dMax non siano quasi coincidenti ( la limitazione dei range può
|
||||
// far collassare gli intervalli )
|
||||
if ( abs( dMax - dMin) < EPS_SMALL)
|
||||
return true ;
|
||||
|
||||
// Riporto le coordinate cicliche nell'ordine di partenza
|
||||
if ( nGrid == 1) {
|
||||
swap( vtNmi.x, vtNmi.z) ;
|
||||
swap( vtNmi.y, vtNmi.z) ;
|
||||
swap( vtNma.x, vtNma.z) ;
|
||||
swap( vtNma.y, vtNma.z) ;
|
||||
}
|
||||
else if ( nGrid == 2) {
|
||||
swap( vtNmi.y, vtNmi.z) ;
|
||||
swap( vtNmi.x, vtNmi.z) ;
|
||||
swap( vtNma.y, vtNma.z) ;
|
||||
swap( vtNma.x, vtNma.z) ;
|
||||
}
|
||||
|
||||
// Calcolo nPos
|
||||
unsigned int nPos = nJ * m_nNx[nGrid] + nI ;
|
||||
vector<Data>& vDexel = m_Values[nGrid][nPos] ;
|
||||
|
||||
bool bModified = false ;
|
||||
|
||||
// se non esistono segmenti...
|
||||
if ( int( vDexel.size()) == 0) { // ... definisco il primo
|
||||
vDexel.emplace_back() ;
|
||||
vDexel.back().dMin = dMin ;
|
||||
vDexel.back().vtMinN = vtNmi ;
|
||||
vDexel.back().nToolMin = nToolNum ;
|
||||
vDexel.back().dMax = dMax ;
|
||||
vDexel.back().vtMaxN = vtNma ;
|
||||
vDexel.back().nToolMax = nToolNum ;
|
||||
m_OGrMgr.Reset() ;
|
||||
bModified = true ; // modifica effettuata
|
||||
}
|
||||
// se ne esiste almeno uno, devo controllare possibili overlaps
|
||||
else {
|
||||
// Cerco l'ultimo intervallo a sinistra e l'ultimo intervallo a destra di quello da aggiungere,
|
||||
// che non interferiscono con quest'ultimo
|
||||
auto itLastLeft = vDexel.end() ;
|
||||
auto itFirstRight = vDexel.end() ; // per bloccare la prima iterazione...
|
||||
for ( auto it = vDexel.begin() ; it != vDexel.end() ; ++ it) {
|
||||
// se il minimo attuale è maggiore del massimo it-esimo, l'intervallo it-esimo è a sinistra
|
||||
if ( dMin > it->dMax + EPS_SMALL)
|
||||
itLastLeft = it ; // aggiorno
|
||||
// se il massimo attuale è minore del minimo it-esimo, l'interallo it-esimo è a destra
|
||||
if ( dMax < it->dMin - EPS_SMALL && itFirstRight == vDexel.end())
|
||||
itFirstRight = it ; // aggiorno
|
||||
}
|
||||
|
||||
// se esistono intervalli a sinistra... ( inizialmente l'iteratore è inizializzato su end())
|
||||
if ( itLastLeft != vDexel.end()) {
|
||||
// prendo il successivo dell'ultimo più vicino
|
||||
auto itNextToLastLeft = itLastLeft ;
|
||||
++ itNextToLastLeft ;
|
||||
|
||||
// e se il successivo a sinistra non esiste...
|
||||
if ( itNextToLastLeft == vDexel.end()) {
|
||||
// aggiorno l'ultimo intervallo
|
||||
vDexel.emplace_back() ;
|
||||
vDexel.back().dMin = dMin ;
|
||||
vDexel.back().dMax = dMax ;
|
||||
vDexel.back().vtMinN = vtNmi ;
|
||||
vDexel.back().vtMaxN = vtNma;
|
||||
vDexel.back().nToolMin = nToolNum ;
|
||||
vDexel.back().nToolMax = nToolNum ;
|
||||
bModified = true ;
|
||||
}
|
||||
// se esiste...
|
||||
else {
|
||||
// controllo se coincide con il primo trovato a destra...
|
||||
if ( itNextToLastLeft == itFirstRight) {
|
||||
// in questo caso definisco il nuovo intervallo
|
||||
Data NewSegment ;
|
||||
NewSegment.dMin = dMin ;
|
||||
NewSegment.dMax = dMax ;
|
||||
NewSegment.vtMinN = vtNmi ;
|
||||
NewSegment.vtMaxN = vtNma ;
|
||||
NewSegment.nToolMin = nToolNum ;
|
||||
NewSegment.nToolMax = nToolNum ;
|
||||
vDexel.insert( itFirstRight, NewSegment) ; // inserimento intervallo
|
||||
bModified = true ;
|
||||
}
|
||||
else {
|
||||
// se il successivo non esce a sinistra da quello da aggiungere
|
||||
if ( itNextToLastLeft->dMin > dMin + EPS_SMALL) {
|
||||
itNextToLastLeft->dMin = dMin ;
|
||||
itNextToLastLeft->vtMinN = vtNmi ;
|
||||
itNextToLastLeft->nToolMin = nToolNum ;
|
||||
}
|
||||
// cerco poi l'ultimo segmento che interferisce con quello da aggiungere
|
||||
auto itPrevToFirstRight = vDexel.end() ;
|
||||
for ( auto it = itNextToLastLeft ; it != itFirstRight ; ++ it)
|
||||
itPrevToFirstRight = it ;
|
||||
// anche in qesto caso, se l'ultimo che interferisce non esce a destra da quello da aggiungere
|
||||
if ( itPrevToFirstRight->dMax < dMax - EPS_SMALL) {
|
||||
itNextToLastLeft->dMax = dMax ;
|
||||
itNextToLastLeft->vtMaxN = vtNma ;
|
||||
itNextToLastLeft->nToolMax = nToolNum ;
|
||||
bModified = true ;
|
||||
}
|
||||
else {
|
||||
itNextToLastLeft->dMax = itPrevToFirstRight->dMax ;
|
||||
itNextToLastLeft->vtMaxN = itPrevToFirstRight->vtMaxN ;
|
||||
itNextToLastLeft->nToolMax = nToolNum ;
|
||||
bModified = true ;
|
||||
}
|
||||
// cancello il successivo...
|
||||
auto itFirstToCancel = itNextToLastLeft ;
|
||||
++ itFirstToCancel ;
|
||||
vDexel.erase( itFirstToCancel, itFirstRight) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
// se non esiste da destra ...
|
||||
else if ( itFirstRight == m_Values[nGrid][nPos].end()) {
|
||||
// e il primo intervallo non sporge a sinistra ...
|
||||
if ( vDexel.begin()->dMin > dMin + EPS_SMALL) {
|
||||
vDexel.begin()->dMin = dMin ;
|
||||
vDexel.begin()->vtMinN = vtNmi ;
|
||||
vDexel.begin()->nToolMin = nToolNum ;
|
||||
bModified = true ;
|
||||
}
|
||||
// se sporge da destra
|
||||
if ( m_Values[nGrid][nPos].back().dMax > dMax + EPS_SMALL) {
|
||||
// allora ci sono più segmenti, inglobo tutti nel primo
|
||||
if ( vDexel.back().dMax > vDexel.begin()->dMax + EPS_SMALL) {
|
||||
vDexel.begin()->dMax = vDexel.back().dMax ;
|
||||
vDexel.begin()->vtMaxN = vDexel.back().vtMaxN ;
|
||||
vDexel.begin()->nToolMax = nToolNum ;
|
||||
bModified = true ;
|
||||
}
|
||||
}
|
||||
// se l'ultimo intervallo non sporge a destra.
|
||||
else {
|
||||
vDexel.begin()->dMax = dMax ;
|
||||
vDexel.begin()->vtMaxN = vtNma ;
|
||||
vDexel.begin()->nToolMax = nToolNum ;
|
||||
bModified = true ;
|
||||
}
|
||||
// cancello quelli inglobati
|
||||
vDexel.erase( vDexel.begin() + 1, vDexel.end()) ;
|
||||
}
|
||||
// Casi Estremi...
|
||||
else {
|
||||
// 1) Tutti i segmenti sono a destra da quello da aggiungere...
|
||||
if ( itFirstRight == vDexel.begin()) {
|
||||
// -> inserisco il nuovo intervallo
|
||||
Data NewSegment ;
|
||||
NewSegment.dMin = dMin ;
|
||||
NewSegment.dMax = dMax ;
|
||||
NewSegment.vtMinN = vtNmi ;
|
||||
NewSegment.vtMaxN = vtNma ;
|
||||
NewSegment.nToolMin = nToolNum ;
|
||||
NewSegment.nToolMax = nToolNum ;
|
||||
vDexel.insert( vDexel.begin(), NewSegment) ; // posizione iniziale
|
||||
bModified = true ;
|
||||
}
|
||||
else {
|
||||
// se il primo segmento non esce a sinistra da quello da aggiungere, cambio l'inizio
|
||||
if ( vDexel.begin()->dMin > dMin + EPS_SMALL) {
|
||||
vDexel.begin()->dMin = dMin ;
|
||||
vDexel.begin()->vtMinN = vtNmi ;
|
||||
vDexel.begin()->nToolMin = nToolNum ;
|
||||
bModified = true ;
|
||||
}
|
||||
// cerco l'ultimo segmento che interferisce con quello da aggiungere
|
||||
auto itPrevToFirstRight = vDexel.begin() ;
|
||||
for ( auto it = m_Values[nGrid][nPos].begin() ; it != itFirstRight ; ++ it)
|
||||
itPrevToFirstRight = it ;
|
||||
// se l'ultimo che interferisce non esce a destra da quello da aggiungere...
|
||||
if ( itPrevToFirstRight->dMax < dMax - EPS_SMALL) {
|
||||
vDexel.begin()->dMax = dMax ;
|
||||
vDexel.begin()->vtMaxN = vtNma ;
|
||||
vDexel.begin()->nToolMax = nToolNum ;
|
||||
bModified = true ;
|
||||
}
|
||||
// ... altrimenti
|
||||
else {
|
||||
vDexel.begin()->dMax = itPrevToFirstRight->dMax ;
|
||||
vDexel.begin()->vtMaxN = itPrevToFirstRight->vtMaxN ;
|
||||
vDexel.begin()->nToolMax = nToolNum ;
|
||||
bModified = true ;
|
||||
}
|
||||
// cancello gli inglobati ( come prima )
|
||||
auto itFirstToCancel = vDexel.begin() ;
|
||||
++ itFirstToCancel ;
|
||||
vDexel.erase( itFirstToCancel, itFirstRight) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Se nessuna modifica, esco
|
||||
if ( ! bModified)
|
||||
return true ;
|
||||
|
||||
// Imposto ricalcolo della grafica
|
||||
m_OGrMgr.Reset() ;
|
||||
// Imposto forma generica
|
||||
m_nShape = GENERIC ;
|
||||
// Imposto ricalcolo numero di componenti connesse
|
||||
m_nConnectedCompoCount = - 1 ;
|
||||
|
||||
// Passo da indici di dexel a indici di voxel
|
||||
nI /= m_nDexVoxRatio ;
|
||||
nJ /= m_nDexVoxRatio ;
|
||||
|
||||
// Determino quali blocchi sono stati modificati a seconda della griglia
|
||||
if ( nGrid == 0) {
|
||||
// Voxel lungo X
|
||||
int nXStop = 1 ;
|
||||
int nXBlock[2] ;
|
||||
nXBlock[0] = min( nI / m_nVoxNumPerBlock, m_nFracLin[0] - 1) ;
|
||||
if ( nI % N_VOXBLOCK == 0 && nXBlock[0] > 0) {
|
||||
nXBlock[1] = nXBlock[0] - 1 ;
|
||||
++ nXStop ;
|
||||
}
|
||||
// Voxel lungo Y
|
||||
int nYStop = 1 ;
|
||||
int nYBlock[2] ;
|
||||
nYBlock[0] = min( nJ / m_nVoxNumPerBlock, m_nFracLin[1] - 1) ;
|
||||
if ( nJ % N_VOXBLOCK == 0 && nYBlock[0] > 0) {
|
||||
nYBlock[1] = nYBlock[0] - 1 ;
|
||||
++ nYStop ;
|
||||
}
|
||||
// Voxel lungo Z
|
||||
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
|
||||
for ( int tI = 0 ; tI < nXStop ; ++ tI) {
|
||||
for ( int tJ = 0 ; tJ < nYStop ; ++ tJ) {
|
||||
for ( int k = nMinZBlock ; k <= nMaxZBlock ; ++ k) {
|
||||
int nBlockNum = k * m_nFracLin[0] * m_nFracLin[1] + nYBlock[tJ] * m_nFracLin[0] + nXBlock[tI] ;
|
||||
m_BlockToUpdate[nBlockNum] = true ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if ( nGrid == 1) {
|
||||
// Voxel lungo Y
|
||||
int nYStop = 1 ;
|
||||
int nYBlock[2] ;
|
||||
nYBlock[0] = min( nI / m_nVoxNumPerBlock, m_nFracLin[1] - 1) ;
|
||||
if ( nI % N_VOXBLOCK == 0 && nYBlock[0] > 0) {
|
||||
nYBlock[1] = nYBlock[0] - 1 ;
|
||||
++ nYStop ;
|
||||
}
|
||||
// Voxel lungo Z
|
||||
int nZStop = 1 ;
|
||||
int nZBlock[2] ;
|
||||
nZBlock[0] = min( nJ / m_nVoxNumPerBlock, m_nFracLin[2] - 1) ;
|
||||
if ( nJ % N_VOXBLOCK == 0 && nZBlock[0] > 0) {
|
||||
nZBlock[1] = nZBlock[0] - 1 ;
|
||||
++ nZStop ;
|
||||
}
|
||||
// Voxel lungo X
|
||||
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
|
||||
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] * m_nFracLin[0] * m_nFracLin[1] + nYBlock[tI] * m_nFracLin[0] + k ;
|
||||
m_BlockToUpdate[nBlockNum] = true ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if ( nGrid == 2) {
|
||||
// Voxel lungo X
|
||||
int nXStop = 1 ;
|
||||
int nXBlock[2] ;
|
||||
nXBlock[0] = min( nJ / m_nVoxNumPerBlock, m_nFracLin[0] - 1) ;
|
||||
if ( nJ % N_VOXBLOCK == 0 && nXBlock[0] > 0) {
|
||||
nXBlock[1] = nXBlock[0] - 1 ;
|
||||
++ nXStop ;
|
||||
}
|
||||
// Voxel lungo Z
|
||||
int nZStop = 1 ;
|
||||
int nZBlock[2] ;
|
||||
nZBlock[0] = min( nI / m_nVoxNumPerBlock, m_nFracLin[2] - 1) ;
|
||||
if ( nI % N_VOXBLOCK == 0 && nZBlock[0] > 0) {
|
||||
nZBlock[1] = nZBlock[0] - 1 ;
|
||||
++ nZStop ;
|
||||
}
|
||||
// Voxel lungo Y
|
||||
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
|
||||
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] * m_nFracLin[0] * m_nFracLin[1] + k * m_nFracLin[0] + nXBlock[tJ] ;
|
||||
m_BlockToUpdate[nBlockNum] = true ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user