EgtGeomKernel 1.6x5 :

- aggiunto marching cube a Zmap.
This commit is contained in:
Dario Sassi
2017-02-02 08:31:15 +00:00
parent acb2cea3b8
commit 0ebaa582c4
9 changed files with 3150 additions and 3756 deletions
+120 -34
View File
@@ -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 ;
}