EgtGeomKernel 1.6x5 :
- aggiunto marching cube a Zmap.
This commit is contained in:
+120
-34
@@ -31,11 +31,11 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL
|
||||
{
|
||||
|
||||
// Controlli l'ammissibilità delle dimensioni lineari del grezzo e del passo
|
||||
if ( dPrec < EPS_SMALL || dLengthX < EPS_SMALL || dLengthY < EPS_SMALL || dLengthZ < EPS_SMALL)
|
||||
if ( dPrec < EPS_SMALL || dLengthX < EPS_SMALL || dLengthY < EPS_SMALL || dLengthZ < EPS_SMALL)
|
||||
return false ;
|
||||
|
||||
// Aggiorno il passo
|
||||
m_dStep = dPrec ;
|
||||
// Il passo di discretizzazione non può essere inferiore a 100 * EPS_SMALL
|
||||
m_dStep = max( dPrec, 100 * EPS_SMALL) ;
|
||||
|
||||
// Aggiorno la dimensione della mappa 1 o 3
|
||||
m_nMapNum = ( bFlag ? 3 : 1) ;
|
||||
@@ -48,30 +48,48 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL
|
||||
m_MapFrame[0].Set( ptO, X_AX, Y_AX, Z_AX) ;
|
||||
|
||||
// Definisco i vettori dei limiti su indici
|
||||
m_nVNx[0] = static_cast <unsigned int> ( ceil( dLengthX / m_dStep)) ;
|
||||
m_nVNy[0] = static_cast <unsigned int> ( ceil( dLengthY / m_dStep)) ;
|
||||
m_nNx[0] = static_cast <unsigned int> ( floor( ( dLengthX + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ;
|
||||
m_nNy[0] = static_cast <unsigned int> ( floor( ( dLengthY + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ;
|
||||
|
||||
if ( m_nMapNum > 1) {
|
||||
// Definisco il numero di blocchi lungo x e y
|
||||
unsigned int nMinBlockNum = 1 ;
|
||||
|
||||
m_nFracLin[0] = max( nMinBlockNum,
|
||||
m_nNx[0] / m_nDexNumPBlock +
|
||||
( m_nNx[0] % m_nDexNumPBlock >= m_nDexNumPBlock / 2 ? 1 : 0)) ;
|
||||
m_nFracLin[1] = max( nMinBlockNum,
|
||||
m_nNy[0] / m_nDexNumPBlock +
|
||||
( m_nNy[0] % m_nDexNumPBlock >= m_nDexNumPBlock / 2 ? 1 : 0)) ;
|
||||
|
||||
if ( bFlag) {
|
||||
|
||||
m_MapFrame[1].Set( ptO, Y_AX, Z_AX, X_AX) ;
|
||||
m_MapFrame[2].Set( ptO, Z_AX, X_AX, Y_AX) ;
|
||||
|
||||
m_nVNx[1] = static_cast <unsigned int> ( ceil( dLengthY / m_dStep)) ;
|
||||
m_nVNy[1] = static_cast <unsigned int> ( ceil( dLengthZ / m_dStep)) ;
|
||||
m_nNx[1] = static_cast <unsigned int> ( floor( ( dLengthY + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ;
|
||||
m_nNy[1] = static_cast <unsigned int> ( floor( ( dLengthZ + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ;
|
||||
|
||||
m_nVNx[2] = static_cast <unsigned int> ( ceil( dLengthZ / m_dStep)) ;
|
||||
m_nVNy[2] = static_cast <unsigned int> ( ceil( dLengthX / m_dStep)) ;
|
||||
m_nNx[2] = static_cast <unsigned int> ( floor( ( dLengthZ + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ;
|
||||
m_nNy[2] = static_cast <unsigned int> ( floor( ( dLengthX + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ;
|
||||
|
||||
// Definisco il numero di blocchi lungo z
|
||||
m_nFracLin[2] = max( nMinBlockNum,
|
||||
m_nNy[1] / m_nDexNumPBlock +
|
||||
( m_nNy[1] % m_nDexNumPBlock >= m_nDexNumPBlock / 2 ? 1 : 0)) ;
|
||||
}
|
||||
else {
|
||||
|
||||
m_MapFrame[1].Set( ptO, Y_AX, Z_AX, X_AX) ;
|
||||
m_MapFrame[2].Set( ptO, Z_AX, X_AX, Y_AX) ;
|
||||
|
||||
m_nVNx[1] = 0 ;
|
||||
m_nVNy[1] = 0 ;
|
||||
m_nNx[1] = 0 ;
|
||||
m_nNy[1] = 0 ;
|
||||
|
||||
m_nVNx[2] = 0 ;
|
||||
m_nVNy[2] = 0 ;
|
||||
m_nNx[2] = 0 ;
|
||||
m_nNy[2] = 0 ;
|
||||
|
||||
// Definisco il numero di blocchi lungo z
|
||||
m_nFracLin[2] = 1 ;
|
||||
}
|
||||
|
||||
// Definizione della mappa
|
||||
@@ -80,41 +98,61 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL
|
||||
// Calcolo del numero di celle per ogni mappa
|
||||
for ( unsigned int i = 0 ; i < m_nMapNum ; ++ i)
|
||||
|
||||
m_nVDim[i] = m_nVNx[i] * m_nVNy[i] ;
|
||||
m_nDim[i] = m_nNx[i] * m_nNy[i] ;
|
||||
|
||||
// Creazione delle celle per ogni mappa
|
||||
for ( unsigned int i = 0 ; i < m_nMapNum ; ++ i)
|
||||
|
||||
m_TriZValues[i].resize( m_nVDim[i]) ;
|
||||
m_Values[i].resize( m_nDim[i]) ;
|
||||
|
||||
// Riempimento delle celle
|
||||
for ( unsigned int i = 0 ; i < m_nMapNum ; ++ i)
|
||||
for ( unsigned int j = 0 ; j < m_nVDim[i] ; ++ j) {
|
||||
for ( unsigned int j = 0 ; j < m_nDim[i] ; ++ j) {
|
||||
|
||||
m_TriZValues[i][j].resize(2) ;
|
||||
m_Values[i][j].resize(2) ;
|
||||
|
||||
m_TriZValues[i][j][0] = 0 ;
|
||||
m_Values[i][j][0].dZVal = 0 ;
|
||||
|
||||
if ( i == 0)
|
||||
m_TriZValues[i][j][1] = dLengthZ ;
|
||||
else if ( i == 1)
|
||||
m_TriZValues[i][j][1] = dLengthX ;
|
||||
else if ( i == 2)
|
||||
m_TriZValues[i][j][1] = dLengthY ;
|
||||
switch ( i) {
|
||||
case 0 :
|
||||
m_Values[i][j][1].dZVal = dLengthZ ;
|
||||
m_Values[i][j][0].vtN = Vector3d( 0, 0, - 1) ;
|
||||
m_Values[i][j][1].vtN = Vector3d( 0, 0, 1) ;
|
||||
break ;
|
||||
case 1 :
|
||||
m_Values[i][j][1].dZVal = dLengthX ;
|
||||
m_Values[i][j][0].vtN = Vector3d( - 1, 0, 0) ;
|
||||
m_Values[i][j][1].vtN = Vector3d( 1, 0, 0) ;
|
||||
break ;
|
||||
case 2 :
|
||||
m_Values[i][j][1].dZVal = dLengthY ;
|
||||
m_Values[i][j][0].vtN = Vector3d( 0, - 1, 0) ;
|
||||
m_Values[i][j][1].vtN = Vector3d( 0, 1, 0) ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
|
||||
// Definizione delle limitazioni iniziali in Z per ogni mappa
|
||||
for ( unsigned int i = 0 ; i < m_nMapNum ; ++ i) {
|
||||
|
||||
m_dVMinZ[i] = 0 ;
|
||||
m_dMinZ[i] = 0 ;
|
||||
|
||||
if ( i == 0)
|
||||
m_dVMaxZ[i] = dLengthZ ;
|
||||
m_dMaxZ[i] = dLengthZ ;
|
||||
else if ( i == 1)
|
||||
m_dVMaxZ[i] = dLengthX ;
|
||||
m_dMaxZ[i] = dLengthX ;
|
||||
else if ( i == 2)
|
||||
m_dVMaxZ[i] = dLengthY ;
|
||||
m_dMaxZ[i] = dLengthY ;
|
||||
}
|
||||
|
||||
// Ridimensiono e setto il vettore dei blocchi a falso
|
||||
int BlockVecSize = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ;
|
||||
|
||||
m_BlockToUpdate.resize( BlockVecSize) ;
|
||||
|
||||
for ( int nCount = 0 ; nCount < BlockVecSize ; ++ nCount)
|
||||
|
||||
m_BlockToUpdate[nCount] = true ;
|
||||
|
||||
// Aggiornamento dello stato
|
||||
m_nStatus = OK ;
|
||||
@@ -122,10 +160,11 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
bool
|
||||
VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double dPrec, bool bFlag)
|
||||
{
|
||||
|
||||
#if 0
|
||||
Point3d ptMapOrig, ptMapEnd ;
|
||||
|
||||
// Aggiorno la dimensione della mappa 1 o 3
|
||||
@@ -159,6 +198,16 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double
|
||||
// Ridimensiono il vettore di dexel e creo lo Zmap
|
||||
m_TriZValues[0].resize( m_nVDim[0]) ;
|
||||
|
||||
// Definisco il numero di blocchi lungo x e y
|
||||
unsigned int nMinBlockNum = 1 ;
|
||||
|
||||
m_nFracLin[0] = max( nMinBlockNum,
|
||||
m_nVNx[0] / m_nDexNumPBlock +
|
||||
( m_nVNx[0] % m_nDexNumPBlock >= m_nDexNumPBlock / 2 ? 1 : 0)) ;
|
||||
m_nFracLin[1] = max( nMinBlockNum,
|
||||
m_nVNy[0] / m_nDexNumPBlock +
|
||||
( m_nVNy[0] % m_nDexNumPBlock >= m_nDexNumPBlock / 2 ? 1 : 0)) ;
|
||||
|
||||
// Se Tridexel ridimensiono anche gli altri vettori
|
||||
if ( bFlag) {
|
||||
|
||||
@@ -177,6 +226,11 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double
|
||||
|
||||
m_TriZValues[1].resize( m_nVDim[1]) ;
|
||||
m_TriZValues[2].resize( m_nVDim[2]) ;
|
||||
|
||||
// Definisco il numero di blocchi lungo z
|
||||
m_nFracLin[2] = max( nMinBlockNum,
|
||||
m_nVNy[1] / m_nDexNumPBlock +
|
||||
( m_nVNy[1] % m_nDexNumPBlock >= m_nDexNumPBlock / 2 ? 1 : 0)) ;
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -324,10 +378,19 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double
|
||||
m_dVMinZ[2] = 0 ;
|
||||
m_dVMaxZ[2] = 0 ;
|
||||
}
|
||||
|
||||
// Ridimensiono e setto il vettore dei blocchi a falso
|
||||
int BlockVecSize = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ;
|
||||
|
||||
m_BlockToUpdate.resize( BlockVecSize) ;
|
||||
|
||||
for ( int nCount = 0 ; nCount < BlockVecSize ; ++ nCount)
|
||||
|
||||
m_BlockToUpdate[nCount] = true ;
|
||||
|
||||
// Aggiornamento dello stato
|
||||
m_nStatus = OK ;
|
||||
|
||||
#endif
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -335,7 +398,8 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double
|
||||
bool
|
||||
VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag)
|
||||
{
|
||||
// Se la superficie non è chiusa non ha senso continuare
|
||||
#if 0
|
||||
// Se la superficie non è chiusa non ha senso continuare
|
||||
if ( ! Surf.IsClosed())
|
||||
return false ;
|
||||
|
||||
@@ -372,6 +436,16 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag)
|
||||
// Ridimensiono il vettore di dexel e creo lo Zmap
|
||||
m_TriZValues[0].resize( m_nVDim[0]) ;
|
||||
|
||||
// Definisco il numero di blocchi lungo x e y
|
||||
unsigned int nMinBlockNum = 1 ;
|
||||
|
||||
m_nFracLin[0] = max( nMinBlockNum,
|
||||
m_nVNx[0] / m_nDexNumPBlock +
|
||||
( m_nVNx[0] % m_nDexNumPBlock >= m_nDexNumPBlock / 2 ? 1 : 0)) ;
|
||||
m_nFracLin[1] = max( nMinBlockNum,
|
||||
m_nVNy[0] / m_nDexNumPBlock +
|
||||
( m_nVNy[0] % m_nDexNumPBlock >= m_nDexNumPBlock / 2 ? 1 : 0)) ;
|
||||
|
||||
// Se Tridexel ridimensiono anche gli altri vettori
|
||||
if ( bFlag) {
|
||||
|
||||
@@ -390,6 +464,11 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag)
|
||||
|
||||
m_TriZValues[1].resize( m_nVDim[1]) ;
|
||||
m_TriZValues[2].resize( m_nVDim[2]) ;
|
||||
|
||||
// Definisco il numero di blocchi lungo z
|
||||
m_nFracLin[2] = max( nMinBlockNum,
|
||||
m_nVNy[1] / m_nDexNumPBlock +
|
||||
( m_nVNy[1] % m_nDexNumPBlock >= m_nDexNumPBlock / 2 ? 1 : 0)) ;
|
||||
}
|
||||
|
||||
|
||||
@@ -587,9 +666,16 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag)
|
||||
m_dVMaxZ[2] = 0 ;
|
||||
}
|
||||
|
||||
|
||||
// Ridimensiono e setto il vettore dei blocchi a falso
|
||||
int BlockVecSize = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ;
|
||||
|
||||
m_BlockToUpdate.resize( BlockVecSize) ;
|
||||
|
||||
for ( int nCount = 0 ; nCount < BlockVecSize ; ++ nCount)
|
||||
|
||||
m_BlockToUpdate[nCount] = true ;
|
||||
|
||||
m_nStatus = OK ;
|
||||
|
||||
#endif
|
||||
return true ;
|
||||
}
|
||||
Reference in New Issue
Block a user