EgtGeomKernel 1.8f2 :

- migliorie e correzioni a Zmap.
This commit is contained in:
Dario Sassi
2017-06-10 15:43:14 +00:00
parent 17425bc753
commit d9d8b40a02
7 changed files with 287 additions and 367 deletions
+134 -78
View File
@@ -27,7 +27,7 @@ using namespace std ;
//----------------------------------------------------------------------------
bool
VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dLengthZ, double dPrec, bool bFlag)
VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dLengthZ, double dPrec, bool bTriDex)
{
// Controlli sull'ammissibilità delle dimensioni lineari del grezzo e del passo
if ( dPrec < EPS_SMALL || dLengthX < EPS_SMALL || dLengthY < EPS_SMALL || dLengthZ < EPS_SMALL)
@@ -37,7 +37,7 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL
m_dStep = max( dPrec, 100 * EPS_SMALL) ;
// Aggiorno la dimensione della mappa 1 o 3
m_nMapNum = ( bFlag ? 3 : 1) ;
m_nMapNum = ( bTriDex ? 3 : 1) ;
// Disponendo i sistemi di riferimento in una successione, le coordinate x,y,z
// di uno si ottengono da una permutazione ciclica di quelle del precedente sistema.
@@ -64,7 +64,7 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL
m_nConnectedCompoCount = 1 ;
// Se tridexel
if ( bFlag) {
if ( bTriDex) {
m_MapFrame[1].Set( ptO, Y_AX, Z_AX, X_AX) ;
m_MapFrame[2].Set( ptO, Z_AX, X_AX, Y_AX) ;
@@ -78,7 +78,7 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL
// 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)) ;
( m_nNy[1] % m_nDexNumPBlock >= m_nDexNumPBlock / 2 ? 1 : 0)) ;
}
// altrimenti mono dexel
else {
@@ -152,7 +152,7 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL
}
// Ridimensiono e setto il vettore dei blocchi a falso
m_nNumBlock = ( bFlag ? m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] : m_nFracLin[0] * m_nFracLin[1]) ;
m_nNumBlock = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ;
m_BlockToUpdate.resize( m_nNumBlock) ;
for ( unsigned int nCount = 0 ; nCount < m_nNumBlock ; ++ nCount)
@@ -166,12 +166,12 @@ 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)
VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double dPrec, bool bTriDex)
{
// Aggiorno la dimensione della mappa 1 o 3
m_nMapNum = ( bFlag ? 3 : 1) ;
m_nMapNum = ( bTriDex ? 3 : 1) ;
// Il passo di discretizzazione non può essere inferiore a 100 * EPS_SMALL
m_dStep = max( dPrec, 100 * EPS_SMALL) ;
@@ -212,10 +212,10 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double
( m_nNy[0] % m_nDexNumPBlock >= m_nDexNumPBlock / 2 ? 1 : 0)) ;
// Numero di componenti connesse
m_nConnectedCompoCount = - 1 ;
m_nConnectedCompoCount = Surf.GetChunkCount() ;
// Se Tridexel ridimensiono anche gli altri vettori
if ( bFlag) {
if ( bTriDex) {
m_MapFrame[1].Set( ptMapOrig, Y_AX, Z_AX, X_AX) ;
m_MapFrame[2].Set( ptMapOrig, Z_AX, X_AX, Y_AX) ;
@@ -252,6 +252,9 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double
m_nNy[2] = 0 ;
m_nDim[2] = 0 ;
// Definisco il numero di blocchi lungo z
m_nFracLin[2] = 1 ;
}
// Determinazione e ridimensionamento dei dexel
@@ -289,6 +292,72 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double
int nStartJ = Clamp( int( floor( dt1 * dLengthY / m_dStep - EPS_SMALL + 0.5)), 0, m_nNy[0] - 1) ;
int nEndJ = Clamp( int( floor( dt2 * dLengthY / m_dStep + EPS_SMALL - 0.5)), 0, m_nNy[0] - 1) ;
// Punti estremi della parte di retta corrente
Point3d ptP1 = ptP0 + dt1 * dLengthY * Y_AX ;
Point3d ptP2 = ptP0 + dt2 * dLengthY * Y_AX ;
// Determino il numero della componente connessa e le normali
int nCompo ;
Vector3d vtN1, vtN2 ;
// Numero di componenti connesse
int nChunkNum = m_nConnectedCompoCount ;
// Ciclo sulle componenti connesse
for ( int nChunk = 0 ; nChunk < nChunkNum ; ++ nChunk) {
int nFind = 0 ;
// Numero di looop della componente connessa
int nLoopNum = Surf.GetLoopCount( nChunk) ;
// Ciclo sui loop della componente
for ( int nLoop = 0 ; nLoop < nLoopNum ; ++ nLoop) {
ICurve * pCurve = Surf.GetLoop( nChunk, nLoop) ;
if ( pCurve -> IsPointOn( ptP1, 10 * EPS_SMALL)) {
double dP1 ;
Point3d ptTemp1 ;
Vector3d vtT1 ;
pCurve -> GetParamAtPoint(ptP1, dP1) ;
pCurve -> GetPointTang( dP1, ICurve::FROM_MINUS, ptTemp1, vtT1) ;
vtN1 = vtT1 ^ Z_AX ;
nFind ++ ;
}
if ( pCurve -> IsPointOn( ptP2, 10 * EPS_SMALL)) {
double dP2 ;
Point3d ptTemp2 ;
Vector3d vtT2 ;
pCurve -> GetParamAtPoint(ptP2, dP2) ;
pCurve -> GetPointTang( dP2, ICurve::FROM_MINUS, ptTemp2, vtT2) ;
vtN2 = vtT2 ^ Z_AX ;
nFind ++ ;
}
// Se abbiamo trovato la componente
// connessa, usciamo dal ciclo.
if ( nFind == 2) {
nCompo = nChunk + 1 ;
break ;
}
}
// Se trovata componente esco dal cilco
if ( nFind == 2)
break ;
}
// Ridimensiono e riempio i dexel
for ( int j = nStartJ ; j <= nEndJ ; ++ j) {
// Determino il dexel
@@ -304,12 +373,12 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double
m_Values[0][nPos0][0].vtMinN = - Z_AX ;
m_Values[0][nPos0][0].vtMaxN = Z_AX ;
m_Values[0][nPos0][0].nToolMax = 0 ;
m_Values[0][nPos0][0].nCompo = 0 ;
m_Values[0][nPos0][0].nCompo = nCompo ;
}
// Se tridexel riempio i singoli dexel della
// griglia 2 con gli intervalli
if ( bFlag) {
if ( bTriDex) {
for ( size_t a = 0 ; a < m_nNx[2] ; ++ a) {
@@ -325,63 +394,19 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double
m_Values[2][nPos2][nCurrentSize].nToolMin = 0 ;
m_Values[2][nPos2][nCurrentSize].dMax = dt2 * dLengthY ;
m_Values[2][nPos2][nCurrentSize].nToolMax = 0 ;
Point3d ptP1 = ptP0 + dt1 * dLengthY * Y_AX ;//+ ( a + 0.5) * Z_AX ;
Point3d ptP2 = ptP0 + dt2 * dLengthY * Y_AX ;//+ ( a + 0.5) * Z_AX ;
int nChunkNum = Surf.GetChunkCount() ;
for ( int nChunk = 0 ; nChunk < nChunkNum ; ++ nChunk) {
int nLoopNum = Surf.GetLoopCount( nChunk) ;
for ( int nLoop = 0 ; nLoop < nLoopNum ; ++ nLoop) {
ICurve * pCurve = Surf.GetLoop( nChunk, nLoop) ;
if ( pCurve -> IsPointOn( ptP1)) {
double dP1 ;
Vector3d vtT1, vtN1 ;
pCurve -> GetParamAtPoint(ptP1, dP1) ;
pCurve -> GetPointTang( dP1, ICurve::FROM_MINUS, ptP1, vtT1) ;
vtN1 = vtT1 ^ Z_AX ;
// Aggiorno normale inferiore al tratto di dexel
m_Values[2][nPos2][nCurrentSize].vtMinN = vtN1 ;
}
if ( pCurve -> IsPointOn( ptP2)) {
double dP2 ;
Vector3d vtT2, vtN2 ;
pCurve -> GetParamAtPoint(ptP2, dP2) ;
pCurve -> GetPointTang( dP2, ICurve::FROM_MINUS, ptP1, vtT2) ;
vtN2 = vtT2 ^ Z_AX ;
// Aggiorno normale superiore al tratto di dexel
m_Values[2][nPos2][nCurrentSize].vtMaxN = vtN2 ;
}
}
}
m_Values[2][nPos2][nCurrentSize].vtMinN = vtN1 ;
m_Values[2][nPos2][nCurrentSize].vtMaxN = vtN2 ;
// Aggiorno il numero della componente connessa
m_Values[2][nPos2][nCurrentSize].nCompo = 0 ;
m_Values[2][nPos2][nCurrentSize].nCompo = nCompo ;
}
}
}
}
} ///// Fine parte relativa a un segmento
}
}
// Se tridexel resta la griglia 1
if ( bFlag) {
if ( bTriDex) {
for ( unsigned int i = 0 ; i < m_nNx[1] ; ++ i) {
@@ -424,8 +449,7 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double
m_Values[1][nPos1][nCurrentSize].nToolMin = 0 ;
m_Values[1][nPos1][nCurrentSize].dMax = dt2 * dLengthX ;
m_Values[1][nPos1][nCurrentSize].nToolMax = 0 ;
// Aggiorno il numero della componente connessa
m_Values[1][nPos1][nCurrentSize].nCompo = 0 ;
Point3d ptP1 = ptP0 + dt1 * dLengthX * X_AX ;
Point3d ptP2 = ptP0 + dt2 * dLengthX * X_AX ;
@@ -434,39 +458,56 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double
for ( int nChunk = 0 ; nChunk < nChunkNum ; ++ nChunk) {
// Indice per ricerca della componente connessa
int nFind = 0 ;
int nLoopNum = Surf.GetLoopCount( nChunk) ;
for ( int nLoop = 0 ; nLoop < nLoopNum ; ++ nLoop) {
ICurve * pCurve = Surf.GetLoop( nChunk, nLoop) ;
if ( pCurve -> IsPointOn( ptP1)) {
if ( pCurve -> IsPointOn( ptP1, 10 * EPS_SMALL)) {
double dP1 ;
Point3d ptTemp1 ;
Vector3d vtT1, vtN1 ;
pCurve -> GetParamAtPoint(ptP1, dP1) ;
pCurve -> GetPointTang( dP1, ICurve::FROM_MINUS, ptP1, vtT1) ;
pCurve -> GetPointTang( dP1, ICurve::FROM_MINUS, ptTemp1, vtT1) ;
vtN1 = vtT1 ^ Z_AX ;
// Aggiorno normale inferiore al tratto di dexel
m_Values[1][nPos1][nCurrentSize].vtMinN = vtN1 ;
nFind ++ ;
}
if ( pCurve -> IsPointOn( ptP2)) {
if ( pCurve -> IsPointOn( ptP2, 10 * EPS_SMALL)) {
double dP2 ;
Point3d ptTemp2 ;
Vector3d vtT2, vtN2 ;
pCurve -> GetParamAtPoint(ptP2, dP2) ;
pCurve -> GetPointTang( dP2, ICurve::FROM_MINUS, ptP1, vtT2) ;
pCurve -> GetPointTang( dP2, ICurve::FROM_MINUS, ptTemp2, vtT2) ;
vtN2 = vtT2 ^ Z_AX ;
// Aggiorno normale superiore al tratto di dexel
m_Values[1][nPos1][nCurrentSize].vtMaxN = vtN2 ;
}
nFind ++ ;
}
// Se trovata componente esco dal cilco
if ( nFind == 2) {
// Aggiorno il numero della componente connessa
m_Values[1][nPos1][nCurrentSize].nCompo = nChunk + 1 ;
}
}
// Se trovata componente esco dal cilco
if ( nFind == 2)
break ;
}
}
}
@@ -477,7 +518,7 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double
m_dMinZ[0] = 0 ;
m_dMaxZ[0] = dDimZ ;
if ( bFlag) {
if ( bTriDex) {
m_dMinZ[1] = 0 ;
m_dMaxZ[1] = dLengthX ;
@@ -493,7 +534,7 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double
}
// Ridimensiono e setto il vettore dei blocchi a falso
m_nNumBlock = ( bFlag ? m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] : m_nFracLin[0] * m_nFracLin[1]) ;
m_nNumBlock = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ;
m_BlockToUpdate.resize( m_nNumBlock) ;
for ( unsigned int nCount = 0 ; nCount < m_nNumBlock ; ++ nCount)
@@ -509,14 +550,14 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double
//----------------------------------------------------------------------------
bool
VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag)
VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bTriDex)
{
// Se la superficie non è chiusa non ha senso continuare
if ( ! Surf.IsClosed())
return false ;
// Aggiorno la dimensione della mappa 1 o 3
m_nMapNum = ( bFlag ? 3 : 1) ;
m_nMapNum = ( bTriDex ? 3 : 1) ;
// Determino il bounding box della TriMesh
BBox3d SurfBBox ;
@@ -562,7 +603,7 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag)
m_nConnectedCompoCount = - 1 ;
// Se Tridexel ridimensiono anche gli altri vettori
if ( bFlag) {
if ( bTriDex) {
m_MapFrame[1].Set( ptMapOrig, Y_AX, Z_AX, X_AX) ; // Sarà Front Left
m_MapFrame[2].Set( ptMapOrig, Z_AX, X_AX, Y_AX) ;
@@ -585,7 +626,22 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag)
m_nNy[1] / m_nDexNumPBlock +
( m_nNy[1] % m_nDexNumPBlock >= m_nDexNumPBlock / 2 ? 1 : 0)) ;
}
else {
m_MapFrame[1].Set( ptMapOrig, Y_AX, Z_AX, X_AX) ;
m_MapFrame[2].Set( ptMapOrig, Z_AX, X_AX, Y_AX) ;
m_nNx[1] = 0 ;
m_nNy[1] = 0 ;
m_nDim[1] = 0 ;
m_nNx[2] = 0 ;
m_nNy[2] = 0 ;
m_nDim[2] = 0 ;
// Definisco il numero di blocchi lungo z
m_nFracLin[2] = 1 ;
}
// Oggetto per calcolo massivo intersezioni
IntersParLinesSurfTm intPLSTM( m_MapFrame[0], Surf) ;
@@ -667,7 +723,7 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag)
}
}
if ( bFlag) {
if ( bTriDex) {
IntersParLinesSurfTm intPLSTM1( m_MapFrame[1], Surf) ;
@@ -830,7 +886,7 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag)
m_dMinZ[0] = 0 ;
m_dMaxZ[0] = dLengthZ ;
if ( bFlag) {
if ( bTriDex) {
m_dMinZ[1] = 0 ;
m_dMaxZ[1] = dLengthX ;
m_dMinZ[2] = 0 ;
@@ -844,7 +900,7 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag)
}
// Ridimensiono e setto il vettore dei blocchi a falso
m_nNumBlock = ( bFlag ? m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] : m_nFracLin[0] * m_nFracLin[1]) ;
m_nNumBlock = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ;
m_BlockToUpdate.resize( m_nNumBlock) ;
for ( unsigned int nCount = 0 ; nCount < m_nNumBlock ; ++ nCount)