EgtGeomKernel 1.6x5 :
- aggiunto marching cube a Zmap.
This commit is contained in:
+51
-48
@@ -28,15 +28,18 @@ GEOOBJ_REGISTER( VOL_ZMAP, NGE_V_ZMP, VolZmap) ;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
VolZmap::VolZmap(void)
|
||||
: m_nStatus( TO_VERIFY), m_dStep( EPS_SMALL), m_nTempProp( 0), m_dLinTol( LIN_TOL_STD), m_dAngTolDeg( ANG_TOL_APPROX_DEG)
|
||||
: m_nStatus( TO_VERIFY), m_dStep( EPS_SMALL), m_nTempProp( 0), m_dLinTol( LIN_TOL_STD), m_dAngTolDeg( ANG_TOL_APPROX_DEG),
|
||||
m_nDexNumPBlock( N_DEXBLOCK)
|
||||
{
|
||||
m_nMapNum = 0 ;
|
||||
m_nNumBlock = 0 ;
|
||||
for ( int i = 0 ; i < N_MAPS ; ++ i) {
|
||||
m_nVNx[i] = 0 ;
|
||||
m_nVNy[i] = 0 ;
|
||||
m_nVDim[i] = 0 ;
|
||||
m_dVMinZ[i] = 0 ;
|
||||
m_dVMaxZ[i] = 0 ;
|
||||
m_nNx[i] = 0 ;
|
||||
m_nNy[i] = 0 ;
|
||||
m_nDim[i] = 0 ;
|
||||
m_dMinZ[i] = 0 ;
|
||||
m_dMaxZ[i] = 0 ;
|
||||
m_nFracLin[i] = 0 ;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,12 +56,12 @@ VolZmap::Clear( void)
|
||||
m_nMapNum = 0 ;
|
||||
for ( int i = 0 ; i < N_MAPS ; ++ i) {
|
||||
m_MapFrame[i].Reset() ;
|
||||
m_nVNx[i] = 0 ;
|
||||
m_nVNy[i] = 0 ;
|
||||
m_nVDim[i] = 0 ;
|
||||
m_dVMinZ[i] = 0 ;
|
||||
m_dVMaxZ[i] = 0 ;
|
||||
m_TriZValues[i].clear() ;
|
||||
m_nNx[i] = 0 ;
|
||||
m_nNy[i] = 0 ;
|
||||
m_nDim[i] = 0 ;
|
||||
m_dMinZ[i] = 0 ;
|
||||
m_dMaxZ[i] = 0 ;
|
||||
m_Values[i].clear() ;
|
||||
}
|
||||
m_dStep = EPS_SMALL ;
|
||||
m_dLinTol = LIN_TOL_STD ;
|
||||
@@ -112,14 +115,14 @@ VolZmap::CopyFrom( const VolZmap& vzmSrc)
|
||||
|
||||
m_MapFrame[i] = vzmSrc.m_MapFrame[i] ;
|
||||
|
||||
m_nVNx[i] = vzmSrc.m_nVNx[i] ;
|
||||
m_nVNy[i] = vzmSrc.m_nVNy[i] ;
|
||||
m_nVDim[i] = vzmSrc.m_nVDim[i] ;
|
||||
m_nNx[i] = vzmSrc.m_nNx[i] ;
|
||||
m_nNy[i] = vzmSrc.m_nNy[i] ;
|
||||
m_nDim[i] = vzmSrc.m_nDim[i] ;
|
||||
|
||||
m_dVMinZ[i] = vzmSrc.m_dVMinZ[i] ;
|
||||
m_dVMaxZ[i] = vzmSrc.m_dVMaxZ[i] ;
|
||||
m_dMinZ[i] = vzmSrc.m_dMinZ[i] ;
|
||||
m_dMaxZ[i] = vzmSrc.m_dMaxZ[i] ;
|
||||
|
||||
m_TriZValues[i] = vzmSrc.m_TriZValues[i] ;
|
||||
m_Values[i] = vzmSrc.m_Values[i] ;
|
||||
}
|
||||
|
||||
m_dStep = vzmSrc.m_dStep ;
|
||||
@@ -168,9 +171,9 @@ VolZmap::Save( NgeWriter& ngeOut) const
|
||||
for ( unsigned int i = 0 ; i < m_nMapNum ; ++ i) {
|
||||
if ( ! ngeOut.WriteFrame( m_MapFrame[i], ";", true))
|
||||
return false ;
|
||||
if ( ! ngeOut.WriteInt( m_nVNx[i], ",", false))
|
||||
if ( ! ngeOut.WriteInt( m_nNx[i], ",", false))
|
||||
return false ;
|
||||
if ( ! ngeOut.WriteInt( m_nVNy[i], ";", true))
|
||||
if ( ! ngeOut.WriteInt( m_nNy[i], ";", true))
|
||||
return false ;
|
||||
}
|
||||
// passo di campionamento (distanza tra spilloni)
|
||||
@@ -179,9 +182,9 @@ VolZmap::Save( NgeWriter& ngeOut) const
|
||||
// ciclo sulle mappe
|
||||
for ( unsigned int i = 0 ; i < m_nMapNum ; ++ i) {
|
||||
// ciclo sui dexel
|
||||
for ( unsigned int j = 0 ; j < m_nVDim[i] ; ++ j) {
|
||||
for ( unsigned int j = 0 ; j < m_nDim[i] ; ++ j) {
|
||||
// numero di estremi
|
||||
unsigned int nDim = unsigned int( m_TriZValues[i][j].size()) ;
|
||||
unsigned int nDim = unsigned int( m_Values[i][j].size()) ;
|
||||
if ( ! ngeOut.WriteInt( nDim, ",", false))
|
||||
return false ;
|
||||
// se dexel nullo
|
||||
@@ -194,7 +197,7 @@ VolZmap::Save( NgeWriter& ngeOut) const
|
||||
else {
|
||||
for ( unsigned int k = 0 ; k < nDim ; ++ k) {
|
||||
bool bEndL = ( k == nDim - 1) ;
|
||||
if ( ! ngeOut.WriteDouble( m_TriZValues[i][j][k], ( bEndL ? ";" : ","), bEndL))
|
||||
if ( ! ngeOut.WriteDouble( m_Values[i][j][k].dZVal, ( bEndL ? ";" : ","), bEndL))
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
@@ -215,11 +218,11 @@ VolZmap::Load( NgeReader& ngeIn)
|
||||
for ( unsigned int i = 0 ; i < m_nMapNum ; ++ i) {
|
||||
if ( ! ngeIn.ReadFrame( m_MapFrame[i], ";", true))
|
||||
return false ;
|
||||
if ( ! ngeIn.ReadInt( m_nVNx[i], ",", false))
|
||||
if ( ! ngeIn.ReadInt( m_nNx[i], ",", false))
|
||||
return false ;
|
||||
if ( ! ngeIn.ReadInt( m_nVNy[i], ";", true))
|
||||
if ( ! ngeIn.ReadInt( m_nNy[i], ";", true))
|
||||
return false ;
|
||||
m_nVDim[i] = m_nVNx[i] * m_nVNy[i] ;
|
||||
m_nDim[i] = m_nNx[i] * m_nNy[i] ;
|
||||
}
|
||||
// passo di campionamento (distanza tra spilloni)
|
||||
if ( ! ngeIn.ReadDouble( m_dStep, ";", true))
|
||||
@@ -227,9 +230,9 @@ VolZmap::Load( NgeReader& ngeIn)
|
||||
// ciclo sulle mappe
|
||||
for ( unsigned int i = 0 ; i < m_nMapNum ; ++ i) {
|
||||
// dimensiono i vettori
|
||||
m_TriZValues[i].resize( m_nVDim[i]) ;
|
||||
m_Values[i].resize( m_nDim[i]) ;
|
||||
// ciclo sui dexel
|
||||
for ( unsigned int j = 0 ; j < m_nVDim[i] ; ++ j) {
|
||||
for ( unsigned int j = 0 ; j < m_nDim[i] ; ++ j) {
|
||||
// leggo il numero di estremi nel dexel
|
||||
unsigned int nDim ;
|
||||
if ( ! ngeIn.ReadInt( nDim, ",", false))
|
||||
@@ -247,11 +250,11 @@ VolZmap::Load( NgeReader& ngeIn)
|
||||
// altrimenti
|
||||
else {
|
||||
// dimensiono l'array
|
||||
m_TriZValues[i][j].resize( nDim) ;
|
||||
m_Values[i][j].resize( nDim) ;
|
||||
// leggo i valori
|
||||
for ( unsigned int k = 0 ; k < nDim ; ++ k) {
|
||||
bool bEndL = ( k == nDim - 1) ;
|
||||
if ( ! ngeIn.ReadDouble( m_TriZValues[i][j][k], ( bEndL ? ";" : ","), bEndL))
|
||||
if ( ! ngeIn.ReadDouble( m_Values[i][j][k].dZVal, ( bEndL ? ";" : ","), bEndL))
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
@@ -274,24 +277,24 @@ VolZmap::GetLocalBBox( BBox3d& b3Loc, int nFlag) const
|
||||
// se richiesto approssimato
|
||||
if ( ( nFlag & BBF_EXACT) == 0) {
|
||||
b3Loc.Add( ORIG) ;
|
||||
b3Loc.Add( Point3d( m_nVNx[0] * m_dStep, m_nVNy[0] * m_dStep, m_dVMaxZ[0])) ;
|
||||
b3Loc.Add( Point3d( m_nNx[0] * m_dStep, m_nNy[0] * m_dStep, m_dMaxZ[0])) ;
|
||||
b3Loc.ToGlob( m_MapFrame[0]) ;
|
||||
return true ;
|
||||
}
|
||||
// calcolo preciso
|
||||
// ciclo sui dexel (punti in basso con ciclo aggiunto per punti in alto di ultima riga)
|
||||
double dY = 0 ;
|
||||
for ( size_t j = 0 ; j <= m_nVNy[0] ; ++ j) {
|
||||
size_t jc = ( ( j != m_nVNy[0]) ? j : m_nVNy[0] -1) ;
|
||||
for ( size_t j = 0 ; j <= m_nNy[0] ; ++ j) {
|
||||
size_t jc = ( ( j != m_nNy[0]) ? j : m_nNy[0] -1) ;
|
||||
double dX = 0 ;
|
||||
// punto a sinistra di ogni dexel (aggiungo un ciclo per fare punto a destra di ultimo)
|
||||
for ( size_t i = 0 ; i <= m_nVNx[0] ; ++ i) {
|
||||
size_t ic = ( ( i != m_nVNx[0]) ? i : m_nVNx[0] -1) ;
|
||||
size_t nPos = ic + jc * m_nVNx[0] ;
|
||||
if ( m_TriZValues[0][nPos].size() > 0) {
|
||||
for ( size_t i = 0 ; i <= m_nNx[0] ; ++ i) {
|
||||
size_t ic = ( ( i != m_nNx[0]) ? i : m_nNx[0] -1) ;
|
||||
size_t nPos = ic + jc * m_nNx[0] ;
|
||||
if ( m_Values[0][nPos].size() > 0) {
|
||||
Point3d ptP = m_MapFrame[0].Orig() + dX * m_MapFrame[0].VersX() + dY * m_MapFrame[0].VersY() ;
|
||||
b3Loc.Add( ptP + m_TriZValues[0][nPos][0] * m_MapFrame[0].VersZ()) ;
|
||||
b3Loc.Add( ptP + m_TriZValues[0][nPos][m_TriZValues[0][nPos].size()-1] * m_MapFrame[0].VersZ()) ;
|
||||
b3Loc.Add( ptP + m_Values[0][nPos][0].dZVal * m_MapFrame[0].VersZ()) ;
|
||||
b3Loc.Add( ptP + m_Values[0][nPos][m_Values[0][nPos].size()-1].dZVal * m_MapFrame[0].VersZ()) ;
|
||||
}
|
||||
// passo al punto successivo
|
||||
dX += m_dStep ;
|
||||
@@ -318,24 +321,24 @@ VolZmap::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
|
||||
// se richiesto approssimato
|
||||
if ( ( nFlag & BBF_EXACT) == 0) {
|
||||
b3Ref.Add( ORIG) ;
|
||||
b3Ref.Add( Point3d( m_nVNx[0] * m_dStep, m_nVNy[0] * m_dStep, m_dVMaxZ[0])) ;
|
||||
b3Ref.Add( Point3d( m_nNx[0] * m_dStep, m_nNy[0] * m_dStep, m_dMaxZ[0])) ;
|
||||
b3Ref.ToGlob( frUse) ;
|
||||
return true ;
|
||||
}
|
||||
// calcolo preciso
|
||||
// ciclo sui dexel (punti in basso con ciclo aggiunto per punti in alto di ultima riga)
|
||||
double dY = 0 ;
|
||||
for ( size_t j = 0 ; j <= m_nVNy[0] ; ++ j) {
|
||||
size_t jc = ( ( j != m_nVNy[0]) ? j : m_nVNy[0] -1) ;
|
||||
for ( size_t j = 0 ; j <= m_nNy[0] ; ++ j) {
|
||||
size_t jc = ( ( j != m_nNy[0]) ? j : m_nNy[0] -1) ;
|
||||
double dX = 0 ;
|
||||
// punto a sinistra di ogni dexel (aggiungo un ciclo per fare punto a destra di ultimo)
|
||||
for ( size_t i = 0 ; i <= m_nVNx[0] ; ++ i) {
|
||||
size_t ic = ( ( i != m_nVNx[0]) ? i : m_nVNx[0] -1) ;
|
||||
size_t nPos = ic + jc * m_nVNx[0] ;
|
||||
if ( m_TriZValues[0][nPos].size() > 0) {
|
||||
for ( size_t i = 0 ; i <= m_nNx[0] ; ++ i) {
|
||||
size_t ic = ( ( i != m_nNx[0]) ? i : m_nNx[0] -1) ;
|
||||
size_t nPos = ic + jc * m_nNx[0] ;
|
||||
if ( m_Values[0][nPos].size() > 0) {
|
||||
Point3d ptP = frUse.Orig() + dX * frUse.VersX() + dY * frUse.VersY() ;
|
||||
b3Ref.Add( ptP + m_TriZValues[0][nPos][0] * frUse.VersZ()) ;
|
||||
b3Ref.Add( ptP + m_TriZValues[0][nPos][m_TriZValues[0][nPos].size()-1] * frUse.VersZ()) ;
|
||||
b3Ref.Add( ptP + m_Values[0][nPos][0].dZVal * frUse.VersZ()) ;
|
||||
b3Ref.Add( ptP + m_Values[0][nPos][m_Values[0][nPos].size()-1].dZVal * frUse.VersZ()) ;
|
||||
}
|
||||
// passo al punto successivo
|
||||
dX += m_dStep ;
|
||||
|
||||
Reference in New Issue
Block a user