EgtGeomKernel :
- migliorie varie a Zmap, compresa suddivisione adattativa per visualizzazione.
This commit is contained in:
+81
-239
@@ -399,47 +399,37 @@ VolZmap::CreateMap( const Point3d& ptO, double dLengthX, double dLengthY, double
|
||||
bool
|
||||
VolZmap::SubtractIntervals( unsigned int nI, unsigned int nJ, double dMin, double dMax)
|
||||
{
|
||||
unsigned int nPos ;
|
||||
|
||||
|
||||
// Controllo che dMin e dMax non siano quasi coincidenti
|
||||
// Controllo che dMin e dMax non siano quasi coincidenti
|
||||
if ( abs( dMax - dMin) < EPS_SMALL)
|
||||
|
||||
return true ;
|
||||
// Controllo che dMin < dMax
|
||||
|
||||
if ( dMax < dMin ) {
|
||||
// Controllo che dMin < dMax
|
||||
if ( dMax < dMin )
|
||||
swap( dMax, dMin) ;
|
||||
|
||||
double dTemp = dMax ;
|
||||
|
||||
dMax = dMin ;
|
||||
dMin = dTemp ; // cambiato il 3/2
|
||||
}
|
||||
|
||||
// Calcolo nPos
|
||||
nPos = nJ*m_nNx + nI ; // O nJ*m_Nx + nI + 1 ?
|
||||
// Calcolo nPos dello spillone
|
||||
unsigned int nPos = nJ * m_nNx + nI ;
|
||||
|
||||
// Ciclo sugli intervalli dello spillone
|
||||
bool bModified = false ;
|
||||
unsigned int i = 0 ;
|
||||
while ( i + 1 < m_ZValues[nPos].size()) {
|
||||
|
||||
while ( i < m_ZValues[nPos].size() - 1) {
|
||||
|
||||
if ( m_ZValues[nPos].size() == 0)
|
||||
return true ;
|
||||
// Casi:
|
||||
// Intervallo da sottrarre è tutto a sinistra di quello corrente, non vi è intersezione
|
||||
// Intervallo da sottrarre è tutto a sinistra di quello corrente, non vi è intersezione
|
||||
if ( m_ZValues[nPos][i] > dMax - EPS_SMALL) {
|
||||
|
||||
;
|
||||
}
|
||||
// Intersezione
|
||||
|
||||
// Intersezione
|
||||
else if ( m_ZValues[nPos][i + 1] > dMax + EPS_SMALL) {
|
||||
// L'intervallo corrente corrente viene limitato a sinistra
|
||||
if ( m_ZValues[nPos][i] > dMin - EPS_SMALL) {
|
||||
|
||||
bModified = true ;
|
||||
m_ZValues[nPos][i] = dMax ;
|
||||
}
|
||||
// L'intervallo si divide in due intervalli
|
||||
else {
|
||||
|
||||
bModified = true ;
|
||||
m_ZValues[nPos].resize( m_ZValues[nPos].size() + 2) ;
|
||||
|
||||
for ( size_t j = m_ZValues[nPos].size() - 1 ; j >= i + 3 ; -- j)
|
||||
@@ -452,10 +442,11 @@ VolZmap::SubtractIntervals( unsigned int nI, unsigned int nJ, double dMin, doubl
|
||||
i = i + 2 ;
|
||||
}
|
||||
}
|
||||
|
||||
else {
|
||||
// L'intervallo corrente viene eliminato
|
||||
// L'intervallo corrente viene eliminato
|
||||
if ( m_ZValues[nPos][i] > dMin - EPS_SMALL) {
|
||||
|
||||
bModified = true ;
|
||||
for ( unsigned int j = i ; j < m_ZValues[nPos].size() - 2 ; ++ j)
|
||||
|
||||
m_ZValues[nPos][j] = m_ZValues[nPos][j + 2] ;
|
||||
@@ -464,192 +455,23 @@ VolZmap::SubtractIntervals( unsigned int nI, unsigned int nJ, double dMin, doubl
|
||||
|
||||
i = i - 2 ;
|
||||
}
|
||||
// L'intervallo corrente viene limitato a destra
|
||||
// L'intervallo corrente viene limitato a destra
|
||||
else if ( m_ZValues[nPos][i + 1] > dMin + EPS_SMALL) {
|
||||
|
||||
bModified = true ;
|
||||
m_ZValues[nPos][i + 1] = dMin ;
|
||||
}
|
||||
// L'intervallo da sottrarre è tutto a destra di quello corrente, non vi è intersezione
|
||||
// L'intervallo da sottrarre è tutto a destra di quello corrente, non vi è intersezione
|
||||
else {
|
||||
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
i = i + 2 ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
VolZmap::SubtractIntervals2( unsigned int nI, unsigned int nJ, double dMin, double dMax)
|
||||
{
|
||||
|
||||
unsigned int nPos ;
|
||||
|
||||
|
||||
// Controllo che dMin e dMax non siano quasi coincidenti
|
||||
if ( abs( dMax - dMin) < EPS_SMALL)
|
||||
|
||||
return true ;
|
||||
// Controllo che dMin < dMax
|
||||
|
||||
if ( dMax < dMin ) {
|
||||
|
||||
double dTemp = dMax ;
|
||||
|
||||
dMax = dMin ;
|
||||
dMin = dTemp ;
|
||||
}
|
||||
|
||||
// Calcolo nPos
|
||||
nPos = nJ * m_nNx2 + nI ;
|
||||
|
||||
unsigned int i = 0 ;
|
||||
|
||||
while ( i < m_ZValues2[nPos].size() - 1) {
|
||||
|
||||
if ( m_ZValues2[nPos].size() == 0)
|
||||
return true ;
|
||||
// Casi:
|
||||
// Intervallo da sottrarre è tutto a sinistra di quello corrente, non vi è intersezione
|
||||
if ( m_ZValues2[nPos][i] > dMax - EPS_SMALL) {
|
||||
|
||||
}
|
||||
// Intersezione
|
||||
else if ( m_ZValues2[nPos][i + 1] > dMax + EPS_SMALL) {
|
||||
// L'intervallo corrente corrente viene limitato a sinistra
|
||||
if ( m_ZValues2[nPos][i] > dMin - EPS_SMALL) {
|
||||
|
||||
m_ZValues2[nPos][i] = dMax ;
|
||||
}
|
||||
// L'intervallo si divide in due intervalli
|
||||
else {
|
||||
|
||||
m_ZValues2[nPos].resize( m_ZValues2[nPos].size() + 2) ;
|
||||
|
||||
for ( size_t j = m_ZValues2[nPos].size() - 1 ; j >= i + 3 ; -- j)
|
||||
|
||||
m_ZValues2[nPos][j] = m_ZValues2[nPos][j - 2] ;
|
||||
|
||||
m_ZValues2[nPos][i + 1] = dMin ;
|
||||
m_ZValues2[nPos][i + 2] = dMax ;
|
||||
|
||||
i = i + 2 ;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// L'intervallo corrente viene eliminato
|
||||
if ( m_ZValues2[nPos][i] > dMin - EPS_SMALL) {
|
||||
|
||||
for ( unsigned int j = i ; j < m_ZValues2[nPos].size() - 2 ; ++ j)
|
||||
|
||||
m_ZValues2[nPos][j] = m_ZValues2[nPos][j + 2] ;
|
||||
|
||||
m_ZValues2[nPos].resize( m_ZValues2[nPos].size() - 2) ;
|
||||
|
||||
i = i - 2 ;
|
||||
}
|
||||
// L'intervallo corrente viene limitato a destra
|
||||
else if ( m_ZValues2[nPos][i + 1] > dMin + EPS_SMALL) {
|
||||
|
||||
m_ZValues2[nPos][i + 1] = dMin ;
|
||||
}
|
||||
// L'intervallo da sottrarre è tutto a destra di quello corrente, non vi è intersezione
|
||||
else {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
i = i + 2 ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
VolZmap::SubtractIntervals3( unsigned int nI, unsigned int nJ, double dMin, double dMax)
|
||||
{
|
||||
unsigned int nPos ;
|
||||
|
||||
|
||||
// Controllo che dMin e dMax non siano quasi coincidenti
|
||||
if ( abs( dMax - dMin) < EPS_SMALL)
|
||||
|
||||
return true ;
|
||||
// Controllo che dMin < dMax
|
||||
|
||||
if ( dMax < dMin ) {
|
||||
|
||||
double dTemp = dMax ;
|
||||
|
||||
dMax = dMin ;
|
||||
dMin = dTemp ;
|
||||
}
|
||||
|
||||
// Calcolo nPos
|
||||
nPos = nJ * m_nNx3 + nI ;
|
||||
|
||||
unsigned int i = 0 ;
|
||||
|
||||
while ( i < m_ZValues3[nPos].size() - 1) {
|
||||
|
||||
if ( m_ZValues3[nPos].size() == 0)
|
||||
return true ;
|
||||
// Casi:
|
||||
// Intervallo da sottrarre è tutto a sinistra di quello corrente, non vi è intersezione
|
||||
if ( m_ZValues3[nPos][i] > dMax - EPS_SMALL) {
|
||||
|
||||
}
|
||||
// Intersezione
|
||||
else if ( m_ZValues3[nPos][i + 1] > dMax + EPS_SMALL) {
|
||||
// L'intervallo corrente corrente viene limitato a sinistra
|
||||
if ( m_ZValues3[nPos][i] > dMin - EPS_SMALL) {
|
||||
|
||||
m_ZValues3[nPos][i] = dMax ;
|
||||
}
|
||||
// L'intervallo si divide in due intervalli
|
||||
else {
|
||||
|
||||
m_ZValues3[nPos].resize( m_ZValues3[nPos].size() + 2) ;
|
||||
|
||||
for ( size_t j = m_ZValues3[nPos].size() - 1 ; j >= i + 3 ; -- j)
|
||||
|
||||
m_ZValues3[nPos][j] = m_ZValues3[nPos][j - 2] ;
|
||||
|
||||
m_ZValues3[nPos][i + 1] = dMin ;
|
||||
m_ZValues3[nPos][i + 2] = dMax ;
|
||||
|
||||
i = i + 2 ;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// L'intervallo corrente viene eliminato
|
||||
if ( m_ZValues3[nPos][i] > dMin - EPS_SMALL) {
|
||||
|
||||
for ( unsigned int j = i ; j < m_ZValues3[nPos].size() - 2 ; ++ j)
|
||||
|
||||
m_ZValues3[nPos][j] = m_ZValues3[nPos][j + 2] ;
|
||||
|
||||
m_ZValues3[nPos].resize( m_ZValues3[nPos].size() - 2) ;
|
||||
|
||||
i = i - 2 ;
|
||||
}
|
||||
// L'intervallo corrente viene limitato a destra
|
||||
else if ( m_ZValues3[nPos][i + 1] > dMin + EPS_SMALL) {
|
||||
|
||||
m_ZValues3[nPos][i + 1] = dMin ;
|
||||
}
|
||||
// L'intervallo da sottrarre è tutto a destra di quello corrente, non vi è intersezione
|
||||
else {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
i = i + 2 ;
|
||||
}
|
||||
// Se eseguita modifica, imposto ricalcolo della grafica
|
||||
if ( bModified)
|
||||
m_OGrMgr.Reset() ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
@@ -668,8 +490,7 @@ VolZmap::SubtractIntervals( const Point3d& ptP, double dMin, double dMax)
|
||||
dX = ptPL.x ; dY = ptPL.y ; dZ = ptPL.z ;
|
||||
dhMin = dZ + dMin ; dhMax = dZ + dMax ;
|
||||
|
||||
// Cerco il punto della griglia più vicino
|
||||
|
||||
// Cerco il punto della griglia più vicino (indice è l'intero appena più basso)
|
||||
double integerPartX = floor( dX / m_dStep) ;
|
||||
double integerPartY = floor( dY / m_dStep) ;
|
||||
|
||||
@@ -699,12 +520,13 @@ VolZmap::AddIntervals( unsigned int nI, unsigned int nJ, double dMin, double dMa
|
||||
return true ;
|
||||
|
||||
// Controllo che dMin < dMax
|
||||
if ( dMax < dMin )
|
||||
swap( dMin, dMax) ;
|
||||
if ( dMax < dMin)
|
||||
swap( dMax, dMin) ;
|
||||
|
||||
// Calcolo nPos
|
||||
unsigned int nPos = nJ * m_nNx + nI ; // O nJ*m_Nx + nI + 1 ?
|
||||
// Calcolo nPos
|
||||
unsigned int nPos = nJ * m_nNx + nI ;
|
||||
|
||||
// Se spillone vuoto
|
||||
if ( m_ZValues[nPos].size() == 0) {
|
||||
|
||||
m_ZValues[nPos].resize( 2) ;
|
||||
@@ -712,23 +534,25 @@ VolZmap::AddIntervals( unsigned int nI, unsigned int nJ, double dMin, double dMa
|
||||
m_ZValues[nPos][0] = dMin ;
|
||||
m_ZValues[nPos][1] = dMax ;
|
||||
|
||||
m_OGrMgr.Reset() ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
// Ciclo sugli intervalli dello spillone
|
||||
bool bModified = false ;
|
||||
unsigned int i = 0 ;
|
||||
while ( i + 1 < m_ZValues[nPos].size()) {
|
||||
|
||||
while ( i < m_ZValues[nPos].size() - 1) {
|
||||
|
||||
// Eventuale aggiustamento di intervalli sovrapposti
|
||||
if ( i > 0) {
|
||||
// Caso in cui un intervallo precedente sconfini in quello corrente
|
||||
if ( m_ZValues[nPos][i] < m_ZValues[nPos][i - 1] + EPS_SMALL) {
|
||||
// Se l'intervallo corrente non è contenuto totalmente si esegue l'istruzione successiva
|
||||
// Se l'intervallo corrente non è contenuto totalmente si esegue l'istruzione successiva
|
||||
if ( m_ZValues[nPos][i - 1] < m_ZValues[nPos][i + 1] + EPS_SMALL)
|
||||
|
||||
m_ZValues[nPos][i - 1] = m_ZValues[nPos][i + 1] ;
|
||||
|
||||
for ( unsigned int j = i ; j < m_ZValues[nPos].size() - 2 ; ++ j)
|
||||
|
||||
m_ZValues[nPos][j] = m_ZValues[nPos][j + 2] ;
|
||||
|
||||
m_ZValues[nPos].resize( m_ZValues[nPos].size() - 2) ;
|
||||
@@ -737,44 +561,46 @@ VolZmap::AddIntervals( unsigned int nI, unsigned int nJ, double dMin, double dMa
|
||||
}
|
||||
}
|
||||
|
||||
// Caso in cui devo aggiungere un intervallo a sinistra dell'intervallo corrente
|
||||
// Caso in cui devo aggiungere un intervallo a sinistra dell'intervallo corrente
|
||||
if ( m_ZValues[nPos][i] > dMax + EPS_SMALL) {
|
||||
bModified = true ;
|
||||
|
||||
m_ZValues[nPos].resize( m_ZValues[nPos].size() + 2) ;
|
||||
|
||||
m_ZValues[nPos].resize( m_ZValues[nPos].size() + 2) ;
|
||||
for ( size_t j = m_ZValues[nPos].size() - 1 ; j >= i + 2 ; -- j)
|
||||
m_ZValues[nPos][j] = m_ZValues[nPos][j - 2] ;
|
||||
|
||||
for ( size_t j = m_ZValues[nPos].size() - 1 ; j >= i + 2 ; -- j)
|
||||
|
||||
m_ZValues[nPos][j] = m_ZValues[nPos][j - 2] ;
|
||||
|
||||
m_ZValues[nPos][i] = dMin ;
|
||||
m_ZValues[nPos][i + 1] = dMax ;
|
||||
m_ZValues[nPos][i] = dMin ;
|
||||
m_ZValues[nPos][i + 1] = dMax ;
|
||||
|
||||
i = i + 2 ;
|
||||
i = i + 2 ;
|
||||
}
|
||||
// Casi d'intersezione:
|
||||
|
||||
// Casi d'intersezione:
|
||||
else if ( m_ZValues[nPos][i + 1] > dMax - EPS_SMALL) {
|
||||
// Se l'intervallo da aggiungere sconfina a sinistra modifico il minimo dell'intervalo corrente
|
||||
if (m_ZValues[nPos][i] > dMin - EPS_SMALL) {
|
||||
|
||||
if ( m_ZValues[nPos][i] > dMin - EPS_SMALL) {
|
||||
bModified = true ;
|
||||
m_ZValues[nPos][i] = dMin ;
|
||||
}
|
||||
}
|
||||
|
||||
else {
|
||||
// Se l'intervallo corrente è tutto contenuto nell'intervallo da aggungere modifico gli estremi
|
||||
if ( m_ZValues[nPos][i] > dMin + EPS_SMALL) {
|
||||
|
||||
bModified = true ;
|
||||
m_ZValues[nPos][i] = dMin ;
|
||||
m_ZValues[nPos][i + 1] = dMax ;
|
||||
}
|
||||
// Se l'intervallo da aggiungere sconfina a destra modifico il massimo dell'intervallo corrente
|
||||
else if ( m_ZValues[nPos][i + 1] > dMin - EPS_SMALL) {
|
||||
|
||||
bModified = true ;
|
||||
m_ZValues[nPos][i + 1] = dMax ;
|
||||
}
|
||||
else {
|
||||
// Aggiungo intervallo a destra dell'ultimo intervallo
|
||||
if ( i == m_ZValues[nPos].size() - 2) {
|
||||
|
||||
bModified = true ;
|
||||
m_ZValues[nPos].resize( m_ZValues[nPos].size() + 2) ;
|
||||
|
||||
m_ZValues[nPos][i + 2] = dMin ;
|
||||
@@ -788,6 +614,10 @@ VolZmap::AddIntervals( unsigned int nI, unsigned int nJ, double dMin, double dMa
|
||||
i = i + 2 ;
|
||||
}
|
||||
|
||||
// se eseguita modifica, imposto ricalcolo della grafica
|
||||
if ( bModified)
|
||||
m_OGrMgr.Reset() ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -857,12 +687,12 @@ VolZmap::GetDexelLines( int nDir, int nPos1, int nPos2, POLYLINELIST& lstPL) con
|
||||
bool
|
||||
VolZmap::GetAllTriangles( TRIA3DLIST& lstTria) const
|
||||
{
|
||||
const int DIM_CHUNK = 4 ;
|
||||
for ( int i = 0 ; i < int( m_nNx) ; i += DIM_CHUNK) {
|
||||
int nDimChunkX = min( DIM_CHUNK, int( m_nNx) - i) ;
|
||||
for ( int j = 0 ; j < int( m_nNy) ; j += DIM_CHUNK) {
|
||||
int nDimChunkY = min( DIM_CHUNK, int( m_nNy) - j) ;
|
||||
GetChunkPrisms( i, j, nDimChunkX, nDimChunkY, lstTria) ;
|
||||
const int MAX_DIM_CHUNK = 128 ;
|
||||
for ( int i = 0 ; i < int( m_nNx) ; i += MAX_DIM_CHUNK) {
|
||||
int nDimChunkX = min( MAX_DIM_CHUNK, int( m_nNx) - i) ;
|
||||
for ( int j = 0 ; j < int( m_nNy) ; j += MAX_DIM_CHUNK) {
|
||||
int nDimChunkY = min( MAX_DIM_CHUNK, int( m_nNy) - j) ;
|
||||
GetChunkPrisms( i, j, nDimChunkX, nDimChunkY, MAX_DIM_CHUNK, lstTria) ;
|
||||
}
|
||||
}
|
||||
return true ;
|
||||
@@ -870,7 +700,7 @@ VolZmap::GetAllTriangles( TRIA3DLIST& lstTria) const
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
VolZmap::GetChunkPrisms( int nPos1, int nPos2, int nDim1, int nDim2, TRIA3DLIST& lstTria) const
|
||||
VolZmap::GetChunkPrisms( int nPos1, int nPos2, int nDim1, int nDim2, int nDimChk, TRIA3DLIST& lstTria) const
|
||||
{
|
||||
// determino se è un semplice parallelepipedo
|
||||
bool bIsSimple = true ;
|
||||
@@ -896,6 +726,17 @@ VolZmap::GetChunkPrisms( int nPos1, int nPos2, int nDim1, int nDim2, TRIA3DLIST&
|
||||
if ( bIsSimple) {
|
||||
CalcChunkPrisms( nPos1, nPos2, nDim1, nDim2, lstTria) ;
|
||||
}
|
||||
// se chunk di dimensioni accettabili
|
||||
else if ( nDimChk >= 4) {
|
||||
int nNewDimChk = nDimChk / 2 ;
|
||||
for ( int i = nPos1 ; i < int( nPos1 + nDim1) ; i += nNewDimChk) {
|
||||
int nDimChunkX = min( nNewDimChk, int( nPos1 + nDim1) - i) ;
|
||||
for ( int j = nPos2 ; j < int( nPos2 + nDim2) ; j += nNewDimChk) {
|
||||
int nDimChunkY = min( nNewDimChk, int( nPos2 + nDim2) - j) ;
|
||||
GetChunkPrisms( i, j, nDimChunkX, nDimChunkY, nNewDimChk, lstTria) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
// altrimenti
|
||||
else {
|
||||
// elaboro ogni singolo dexel
|
||||
@@ -1081,8 +922,8 @@ VolZmap::SetStdTool( const string& sToolName, double dH, double dR, double dCorn
|
||||
m_dHeight = dH ;
|
||||
m_dRadius = dR ;
|
||||
m_dTipHeight = dCornR ;
|
||||
m_dTipRadius = m_dRadius ;
|
||||
m_dRCorner = dR - dCornR ;
|
||||
m_dTipRadius = dR - dCornR ;
|
||||
m_dRCorner = dCornR ;
|
||||
// come profilo
|
||||
m_nToolType = GenericTool ;
|
||||
Point3d pt0( 0, 0, 0) ;
|
||||
@@ -1097,6 +938,7 @@ VolZmap::SetStdTool( const string& sToolName, double dH, double dR, double dCorn
|
||||
m_ToolOutline.AddLine( pt2);
|
||||
m_ToolOutline.AddArcTg( pt3) ;
|
||||
m_ToolOutline.AddLine( pt4) ;
|
||||
return SetGenTool( sToolName, &m_ToolOutline) ;
|
||||
}
|
||||
// utensile sferico
|
||||
else if ( dCornR < dR + EPS_SMALL) {
|
||||
@@ -9159,7 +9001,7 @@ VolZmap::MillConusAux( const Point3d& ptI, const Point3d& ptF, const Vector3d& v
|
||||
// Traslazioni
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
VolZmap::Ball( const Point3d& ptLs, const Point3d& ptLe, const double& dRad)
|
||||
VolZmap::Ball( const Point3d& ptLs, const Point3d& ptLe, double dRad)
|
||||
{
|
||||
double dMin, dMax ;
|
||||
unsigned int nStartI, nStartJ, nEndI, nEndJ ;
|
||||
|
||||
Reference in New Issue
Block a user