EgtGeomKernel 1.6x2 :

- modifiche a Zmap per tridexel.
This commit is contained in:
Dario Sassi
2016-12-19 14:35:10 +00:00
parent 3c555f6beb
commit 7ee899b0a2
15 changed files with 9168 additions and 9647 deletions
+143 -100
View File
@@ -28,12 +28,16 @@ GEOOBJ_REGISTER( VOL_ZMAP, NGE_V_ZMP, VolZmap) ;
//----------------------------------------------------------------------------
VolZmap::VolZmap(void)
: m_nStatus( TO_VERIFY), m_nTempProp(), 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_dStep = 0 ;
m_nNx = 0 ;
m_nNy = 0 ;
m_nDim = 0 ;
m_nMapNum = 0 ;
for ( int i = 0 ; i < 3 ; ++ i) {
m_nVNx[i] = 0 ;
m_nVNy[i] = 0 ;
m_nVDim[i] = 0 ;
m_dVMinZ[i] = 0 ;
m_dVMaxZ[i] = 0 ;
}
}
//----------------------------------------------------------------------------
@@ -74,12 +78,24 @@ VolZmap::CopyFrom( const VolZmap& vzmSrc)
if ( &vzmSrc == this)
return true ;
m_OGrMgr.Reset() ;
m_LocalFrame = vzmSrc.m_LocalFrame ;
m_nMapNum = vzmSrc.m_nMapNum ;
for ( int i = 0 ; i < int ( m_nMapNum) ; ++ i) {
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_dVMinZ[i] = vzmSrc.m_dVMinZ[i] ;
m_dVMaxZ[i] = vzmSrc.m_dVMaxZ[i] ;
m_TriZValues[i] = vzmSrc.m_TriZValues[i] ;
}
m_dStep = vzmSrc.m_dStep ;
m_nDim = vzmSrc.m_nDim ;
m_nNx = vzmSrc.m_nNx ;
m_nNy = vzmSrc.m_nNy ;
m_ZValues = vzmSrc.m_ZValues ;
m_nStatus = vzmSrc.m_nStatus ;
m_nTempProp = vzmSrc.m_nTempProp ;
return true ;
@@ -118,38 +134,44 @@ VolZmap::GetNgeId( void) const
bool
VolZmap::Save( NgeWriter& ngeOut) const
{
// parametri di scrittura: sistema di riferimento, minimo incremento, numero di passi
// in direzione x e y, e per ogni casella, numero di valori e valori
if ( ! ngeOut.WriteFrame( m_LocalFrame, ";", true))
return false ;
if ( ! ngeOut.WriteDouble( m_dStep, ",", false))
return false ;
if ( ! ngeOut.WriteInt( m_nNx, ",", false))
return false ;
if ( ! ngeOut.WriteInt( m_nNy, ";", true))
return false ;
// ciclo sui dexel
for ( unsigned int i = 0 ; i < m_nDim ; ++ i) {
// numero di estremi
int nDim = int( m_ZValues[i].size()) ;
if ( ! ngeOut.WriteInt( nDim, ",", false))
// parametri di scrittura: sistema di riferimento, numero di passi
// in direzione x e y, minimo incremento e per ogni casella, numero di valori e valori
for ( int i = 0 ; i < int ( m_nMapNum) ; ++ i) {
if ( ! ngeOut.WriteFrame( m_MapFrame[i], ",", true))
return false ;
if ( ! ngeOut.WriteInt( m_nVNx[i], ",", false))
return false ;
// se dexel nullo
if ( nDim == 0) {
if ( ! ngeOut.WriteInt( m_nVNy[i], ",", true))
return false ;
}
if ( ! ngeOut.WriteDouble( m_dStep, ";", false))
return false ;
// ciclo sulle mappe
for ( int i = 0 ; i < int ( m_nMapNum) ; ++ i) {
// ciclo sui dexel
for ( unsigned int j = 0 ; j < m_nVDim[i] ; ++ j) {
// numero di estremi
int nDim = int( m_TriZValues[i][j].size()) ;
if ( ! ngeOut.WriteInt( nDim, ",", false))
return false ;
// se dexel nullo
if ( nDim == 0) {
// scrivo un valore dummy
if ( ! ngeOut.WriteDouble( 0, ";", true))
return false ;
}
// altrimenti
else {
for ( unsigned int k = 0 ; k < m_ZValues[i].size() ; ++ k) {
bool bEndL = ( k == m_ZValues[i].size() - 1) ;
if ( ! ngeOut.WriteDouble( m_ZValues[i][k], ( bEndL ? ";" : ","), bEndL))
return false ;
}
}
}
// altrimenti
else {
for ( unsigned int k = 0 ; k < m_TriZValues[i][j].size() ; ++ k) {
bool bEndL = ( k == m_TriZValues[i][j].size() - 1) ;
if ( ! ngeOut.WriteDouble( m_TriZValues[i][j][k], ( bEndL ? ";" : ","), bEndL))
return false ;
}
}
}
}
return true ;
}
@@ -158,49 +180,61 @@ bool
VolZmap::Load( NgeReader& ngeIn)
{
m_nStatus = TO_VERIFY ;
// parametri di lettura: sistema di riferimento, minimo incremento, numero di passi
// in direzione x e y, e per ogni casella, numero di valori e valori
if ( ! ngeIn.ReadFrame( m_LocalFrame, ";", true))
return false ;
if ( ! ngeIn.ReadDouble( m_dStep, ",", false))
return false ;
// parametri di lettura: sistema di riferimento, numero di passi
// in direzione x e y, minimo incremento e per ogni casella, numero di valori e valori
int nTemp ;
if ( ! ngeIn.ReadInt( nTemp, ",", false))
return false ;
m_nNx = nTemp ;
if ( ! ngeIn.ReadInt( nTemp, ";", true))
return false ;
m_nNy = nTemp ;
// dimensione del vettore di dexel
m_nDim = m_nNx * m_nNy ;
m_ZValues.resize(m_nDim) ;
for ( int i = 0 ; i < int ( m_nMapNum) ; ++ i) {
// ciclo sui dexel
for ( unsigned int i = 0 ; i < m_nDim ; ++ i) {
// leggo il numero di estremi nel dexel
if ( ! ngeIn.ReadFrame( m_MapFrame[i], ";", true))
return false ;
if ( ! ngeIn.ReadInt( nTemp, ",", false))
return false ;
// devono essere pari
if ( ( nTemp % 2) != 0)
m_nVNx[i] = nTemp ;
if ( ! ngeIn.ReadInt( nTemp, ";", true))
return false ;
// se dexel nullo
if ( nTemp == 0) {
// leggo un valore dummy
double dDummy ;
if ( ! ngeIn.ReadDouble( dDummy, ",", true))
m_nVNy[i] = nTemp ;
}
if ( ! ngeIn.ReadDouble( m_dStep, ",", false))
return false ;
// dimensione dei vettori di dexel
for ( int i = 0 ; i < int ( m_nMapNum) ; ++ i) {
m_nVDim[i] = m_nVNx[i] * m_nVNy[i] ;
m_TriZValues[i].resize(m_nVDim[i]) ;
}
// ciclo sulle mappe
for ( int i = 0 ; i < int ( m_nMapNum) ; ++ i) {
// ciclo sui dexel
for ( unsigned int j = 0 ; j < m_nVDim[i] ; ++ j) {
// leggo il numero di estremi nel dexel
if ( ! ngeIn.ReadInt( nTemp, ",", false))
return false ;
}
// altrimenti
else {
// dimensiono l'array
m_ZValues[i].resize(nTemp) ;
// leggo i valori
for ( unsigned int k = 0 ; k < m_ZValues[i].size() ; ++ k) {
bool bEndL = ( k == m_ZValues[i].size() - 1) ;
if ( ! ngeIn.ReadDouble( m_ZValues[i][k], ( bEndL ? ";" : ","), bEndL))
// devono essere pari
if ( ( nTemp % 2) != 0)
return false ;
// se dexel nullo
if ( nTemp == 0) {
// leggo un valore dummy
double dDummy ;
if ( ! ngeIn.ReadDouble( dDummy, ",", true))
return false ;
}
// altrimenti
else {
// dimensiono l'array
m_TriZValues[i][j].resize(nTemp) ;
// leggo i valori
for ( unsigned int k = 0 ; k < m_TriZValues[i][j].size() ; ++ k) {
bool bEndL = ( k == m_TriZValues[i][j].size() - 1) ;
if ( ! ngeIn.ReadDouble( m_TriZValues[i][j][k], ( bEndL ? ";" : ","), bEndL))
return false ;
}
}
}
}
@@ -220,24 +254,24 @@ VolZmap::GetLocalBBox( BBox3d& b3Loc, int nFlag) const
// se richiesto approssimato
if ( ( nFlag & BBF_EXACT) == 0) {
b3Loc.Add( ORIG) ;
b3Loc.Add( Point3d( m_nNx * m_dStep, m_nNy * m_dStep, m_dMaxZ)) ;
b3Loc.ToGlob( m_LocalFrame) ;
b3Loc.Add( Point3d( m_nVNx[0] * m_dStep, m_nVNy[0] * m_dStep, m_dVMaxZ[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_nNy ; ++ j) {
size_t jc = ( ( j != m_nNy) ? j : m_nNy -1) ;
for ( size_t j = 0 ; j <= m_nVNy[0] ; ++ j) {
size_t jc = ( ( j != m_nVNy[0]) ? j : m_nVNy[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_nNx ; ++ i) {
size_t ic = ( ( i != m_nNx) ? i : m_nNx -1) ;
size_t nPos = ic + jc * m_nNx ;
if ( m_ZValues[nPos].size() > 0) {
Point3d ptP = m_LocalFrame.Orig() + dX * m_LocalFrame.VersX() + dY * m_LocalFrame.VersY() ;
b3Loc.Add( ptP + m_ZValues[nPos][0] * m_LocalFrame.VersZ()) ;
b3Loc.Add( ptP + m_ZValues[nPos][m_ZValues[nPos].size()-1] * m_LocalFrame.VersZ()) ;
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) {
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()) ;
}
// passo al punto successivo
dX += m_dStep ;
@@ -259,29 +293,29 @@ VolZmap::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
// reset box
b3Ref.Reset() ;
// trasformo il riferimento locale tramite quello passato
Frame3d frUse = m_LocalFrame ;
Frame3d frUse = m_MapFrame[0] ;
frUse.ToGlob( frRef) ;
// se richiesto approssimato
if ( ( nFlag & BBF_EXACT) == 0) {
b3Ref.Add( ORIG) ;
b3Ref.Add( Point3d( m_nNx * m_dStep, m_nNy * m_dStep, m_dMaxZ)) ;
b3Ref.Add( Point3d( m_nVNx[0] * m_dStep, m_nVNy[0] * m_dStep, m_dVMaxZ[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_nNy ; ++ j) {
size_t jc = ( ( j != m_nNy) ? j : m_nNy -1) ;
for ( size_t j = 0 ; j <= m_nVNy[0] ; ++ j) {
size_t jc = ( ( j != m_nVNy[0]) ? j : m_nVNy[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_nNx ; ++ i) {
size_t ic = ( ( i != m_nNx) ? i : m_nNx -1) ;
size_t nPos = ic + jc * m_nNx ;
if ( m_ZValues[nPos].size() > 0) {
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) {
Point3d ptP = frUse.Orig() + dX * frUse.VersX() + dY * frUse.VersY() ;
b3Ref.Add( ptP + m_ZValues[nPos][0] * frUse.VersZ()) ;
b3Ref.Add( ptP + m_ZValues[nPos][m_ZValues[nPos].size()-1] * frUse.VersZ()) ;
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()) ;
}
// passo al punto successivo
dX += m_dStep ;
@@ -291,7 +325,7 @@ VolZmap::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
}
return true ;
}
}
//----------------------------------------------------------------------------
bool
@@ -302,8 +336,9 @@ VolZmap::Translate( const Vector3d& vtMove)
return false ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
// traslo il riferimento
m_LocalFrame.Translate( vtMove) ;
// traslo i riferimenti
for ( int i = 0 ; i < int( m_nMapNum) ; ++ i)
m_MapFrame[i].Translate( vtMove) ;
return true ;
}
@@ -316,8 +351,10 @@ VolZmap::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, doub
return false ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
// ruoto il riferimento
return m_LocalFrame.Rotate( ptAx, vtAx, dCosAng, dSinAng) ;
// ruoto i riferimenti
for ( int i = 0 ; i < int( m_nMapNum) ; ++ i)
m_MapFrame[i].Rotate( ptAx, vtAx, dCosAng, dSinAng) ;
return true ;
}
//----------------------------------------------------------------------------
@@ -360,7 +397,9 @@ VolZmap::ToGlob( const Frame3d& frRef)
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
// trasformo il riferimento
return m_LocalFrame.ToGlob( frRef) ;
for ( int i = 0 ; i < int ( m_nMapNum) ; ++ i)
m_MapFrame[i].ToGlob( frRef) ;
return true ;
}
//----------------------------------------------------------------------------
@@ -373,7 +412,9 @@ VolZmap::ToLoc( const Frame3d& frRef)
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
// trasformo il riferimento
return m_LocalFrame.ToLoc( frRef) ;
for ( int i = 0 ; i < int( m_nMapNum) ; ++ i)
m_MapFrame[i].ToLoc( frRef) ;
return true ;
}
//----------------------------------------------------------------------------
@@ -386,7 +427,9 @@ VolZmap::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
// trasformo il riferimento
return m_LocalFrame.LocToLoc( frOri, frDest) ;
for ( int i = 0 ; i < int( m_nMapNum) ; ++ i)
m_MapFrame[i].LocToLoc( frOri, frDest) ;
return true ;
}