From 1f6a7b390a70dcfd60df2031790963fa4f1ce442 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 13 Feb 2017 16:08:54 +0000 Subject: [PATCH] EgtGeomKernel 1.8b2 : - corretta creazione piramide (verso della base) - corretta classificazione curve rispetto a regioni con estremi molto vicini alla curva. --- EgtGeomKernel.rc | Bin 11710 -> 11710 bytes IntersCurveCurve.cpp | 12 +- StmStandard.cpp | 3 +- VolTriZmapCreation.cpp | 374 ++++++++++++++++++++++++++++------------- 4 files changed, 270 insertions(+), 119 deletions(-) diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index dc5ae42a01631085c2ee4f4eef0d43454930a426..dc6fd9d343e68b14e9a45d00931c6a2b8f44c3c1 100644 GIT binary patch delta 94 zcmdlNy)SyhFE&P_&A-_cnHh~HD{|{@_Trkr0u;H;XNwSVW8B;$>;>dw2zN+>g;Df- LFmBFL4&ed-Vf-5U delta 94 zcmdlNy)SyhFE&QQ&A-_cnHdcyD{|{@_Trkr0u;H;XNwSVW8B;$>;>dw2zN+>g;Df- LFmBFL4&ed-U|t&X diff --git a/IntersCurveCurve.cpp b/IntersCurveCurve.cpp index 3ee9ee0..c4e8f7a 100644 --- a/IntersCurveCurve.cpp +++ b/IntersCurveCurve.cpp @@ -505,6 +505,8 @@ IntersCurveCurve::CalcCurveClassification( const ICurve* pCurve, const ICCIVECTO // recupero la classificazione all'inizio della curva int nLastTy = ICCT_NULL ; double dCurrPar = dStartPar ; + double dCurrLen = 0 ; + double dEndLen ; pCurve->GetLength( dEndLen) ; // se è chiusa, recupero come finisce if ( pCurve->IsClosed()) { if ( ! InfoCorr[nNumInters-1].bOverlap) @@ -514,14 +516,18 @@ IntersCurveCurve::CalcCurveClassification( const ICurve* pCurve, const ICCIVECTO // se attraversa il punto di giunzione (parametro di fine minore di quello di inizio) if ( InfoCorr[nNumInters-1].IciA[1].dU < InfoCorr[nNumInters-1].IciA[0].dU) { dCurrPar = InfoCorr[nNumInters-1].IciA[1].dU ; + double dTmpLen ; pCurve->GetLengthAtParam( dCurrPar, dTmpLen) ; + dCurrLen = dTmpLen - dEndLen ; dEndPar = dCurrPar ; + dEndLen = dTmpLen ; } } } // costruisco il vettore delle classificazioni for ( int i = 0 ; i < nNumInters ; ++ i) { // se è definito un tratto precedente - if ( InfoCorr[i].IciA[0].dU > dCurrPar + EPS_PARAM) { + double dLenU ; pCurve->GetLengthAtParam( InfoCorr[i].IciA[0].dU, dLenU) ; + if ( InfoCorr[i].IciA[0].dU > dCurrPar + EPS_PARAM && dLenU - dCurrLen > EPS_SMALL) { // verifico che la definizione sul tratto sia omogenea e valida int nPrevTy = InfoCorr[i].IciA[0].nPrevTy ; if ( ( nLastTy != ICCT_NULL && nPrevTy != nLastTy) || @@ -535,6 +541,7 @@ IntersCurveCurve::CalcCurveClassification( const ICurve* pCurve, const ICCIVECTO ccClass.push_back( segClass) ; // salvo dati correnti dCurrPar = InfoCorr[i].IciA[0].dU ; + dCurrLen = dLenU ; nLastTy = InfoCorr[i].IciA[0].nNextTy ; } // altrimenti, salvo il tipo @@ -550,11 +557,12 @@ IntersCurveCurve::CalcCurveClassification( const ICurve* pCurve, const ICCIVECTO ccClass.push_back( segClass) ; // salvo dati correnti dCurrPar = InfoCorr[i].IciA[1].dU ; + dCurrLen = dLenU ; nLastTy = InfoCorr[i].IciA[1].nNextTy ; } } // eventuale tratto finale rimasto - if ( dCurrPar < dEndPar - EPS_PARAM) { + if ( dCurrPar < dEndPar - EPS_PARAM && dEndLen - dCurrLen > EPS_SMALL) { // verifico che la definizione sul tratto sia valida if ( nLastTy == ICCT_NULL || nLastTy == ICCT_ON) return false ; diff --git a/StmStandard.cpp b/StmStandard.cpp index db80fb1..5f4d0d0 100644 --- a/StmStandard.cpp +++ b/StmStandard.cpp @@ -83,10 +83,11 @@ GetSurfTriMeshPyramid( double dDimX, double dDimY, double dHeight) PtrOwner pSTM( CreateSurfTriMesh()) ; if ( IsNull( pSTM) || ! pSTM->CreateByPointCurve( ptTip, PL)) return nullptr ; - // creo la superficie di base + // creo la superficie di base e ne inverto la normale PtrOwner pSTM1( CreateSurfTriMesh()) ; if ( IsNull( pSTM1) || ! pSTM1->CreateByFlatContour( PL)) return nullptr ; + pSTM1->Invert() ; // la unisco alla superficie del fianco if ( ! pSTM->DoSewing( *pSTM1)) return nullptr ; diff --git a/VolTriZmapCreation.cpp b/VolTriZmapCreation.cpp index 0afffae..dca72ea 100644 --- a/VolTriZmapCreation.cpp +++ b/VolTriZmapCreation.cpp @@ -164,7 +164,6 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL 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 @@ -183,30 +182,31 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double // Sistema di riferimento mappa m_MapFrame[0].Set( ptMapOrig, X_AX, Y_AX, Z_AX) ; - // Determino le dimensioni lineari X Y della griglia double dLengthX = ptMapEnd.x - ptMapOrig.x ; double dLengthY = ptMapEnd.y - ptMapOrig.y ; // A partire dalle dimensioni di xy del grezzo determino il numero di colonne e righe // della griglia Zmap e da questi la dimensione del vettore di dexel - m_nVNx[0] = static_cast ( ceil( dLengthX / m_dStep)) ; - m_nVNy[0] = static_cast ( ceil( dLengthY / m_dStep)) ; + //m_nNx[0] = static_cast ( ceil( dLengthX / m_dStep)) ; + //m_nNy[0] = static_cast ( ceil( dLengthY / m_dStep)) ; + m_nNx[0] = static_cast ( floor( ( dLengthX + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; + m_nNy[0] = static_cast ( floor( ( dLengthY + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - m_nVDim[0] = m_nVNx[0] * m_nVNy[0] ; + m_nDim[0] = m_nNx[0] * m_nNy[0] ; // Ridimensiono il vettore di dexel e creo lo Zmap - m_TriZValues[0].resize( m_nVDim[0]) ; + m_Values[0].resize( m_nDim[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_nNx[0] / m_nDexNumPBlock + + ( m_nNx[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)) ; + m_nNy[0] / m_nDexNumPBlock + + ( m_nNy[0] % m_nDexNumPBlock >= m_nDexNumPBlock / 2 ? 1 : 0)) ; // Se Tridexel ridimensiono anche gli altri vettori if ( bFlag) { @@ -214,51 +214,57 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double m_MapFrame[1].Set( ptMapOrig, Y_AX, Z_AX, X_AX) ; m_MapFrame[2].Set( ptMapOrig, Z_AX, X_AX, Y_AX) ; - m_nVNx[1] = static_cast ( ceil( dLengthY / m_dStep)) ; - m_nVNy[1] = static_cast ( ceil( dDimZ / m_dStep)) ; + //m_nNx[1] = static_cast ( ceil( dLengthY / m_dStep)) ; + //m_nNy[1] = static_cast ( ceil( dDimZ / m_dStep)) ; - m_nVDim[1] = m_nVNx[1] * m_nVNy[1] ; + //m_nNx[2] = static_cast ( ceil( dDimZ / m_dStep)) ; + //m_nNy[2] = static_cast ( ceil( dLengthX / m_dStep)) ; - m_nVNx[2] = static_cast ( ceil( dDimZ / m_dStep)) ; - m_nVNy[2] = static_cast ( ceil( dLengthX / m_dStep)) ; + m_nNx[1] = static_cast ( floor( ( dLengthY + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; + m_nNy[1] = static_cast ( floor( ( dDimZ + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - m_nVDim[2] = m_nVNx[2] * m_nVNy[2] ; + m_nNx[2] = static_cast ( floor( ( dDimZ + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; + m_nNy[2] = static_cast ( floor( ( dLengthX + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - m_TriZValues[1].resize( m_nVDim[1]) ; - m_TriZValues[2].resize( m_nVDim[2]) ; + m_nDim[1] = m_nNx[1] * m_nNy[1] ; + + m_nDim[2] = m_nNx[2] * m_nNy[2] ; + + m_Values[1].resize( m_nDim[1]) ; + m_Values[2].resize( m_nDim[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)) ; + 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_nVNx[1] = 0 ; - m_nVNy[1] = 0 ; + m_nNx[1] = 0 ; + m_nNy[1] = 0 ; - m_nVDim[1] = 0 ; + m_nDim[1] = 0 ; - m_nVNx[2] = 0 ; - m_nVNy[2] = 0 ; + m_nNx[2] = 0 ; + m_nNy[2] = 0 ; - m_nVDim[2] = 0 ; + m_nDim[2] = 0 ; } // Determinazione e ridimensionamento dei dexel // interni alla regione // Griglia 0 - for ( unsigned int i = 0 ; i < m_nVNx[0] ; ++ i) { + for ( unsigned int i = 0 ; i < m_nNx[0] ; ++ i) { // Definisco la retta da intersecare con la regione double dX = ( i + 0.5) * m_dStep ; - Point3d ptP0 = ptMapOrig + Vector3d( dX, 0, 0) ; + Point3d ptP0 = ptMapOrig + Vector3d( dX, 0, 0) ; // CAMBIATO CON EPS CurveLine GridLine ; - GridLine.SetPVL( ptP0, Y_AX, dLengthY) ; + GridLine.SetPVL( ptP0, Y_AX, dLengthY) ; // CAMBIATO CON EPS // Determino le intersezioni della retta con la regione CRVCVECTOR IntersectionResults ; @@ -280,34 +286,78 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double if ( nType == CRVC_IN || nType == CRVC_ON_P || nType == CRVC_ON_M) { // Indici corrispondenti alle coordinate dei punti - int nStartJ = Clamp( int( floor( dt1 * dLengthY / m_dStep + 0.5)), 0, m_nVNy[0] - 1) ; - int nEndJ = Clamp( int( floor( dt2 * dLengthY / m_dStep - 0.5)), 0, m_nVNy[0] - 1) ; + int nStartJ = Clamp( int( floor( dt1 * dLengthY / m_dStep + 0.5)), 0, m_nNy[0] - 1) ; // CAMBIATO CON EPS + int nEndJ = Clamp( int( floor( dt2 * dLengthY / m_dStep - 0.5)), 0, m_nNy[0] - 1) ; // CAMBIATO CON EPS // Ridimensiono e riempio i dexel for ( int j = nStartJ ; j <= nEndJ ; ++ j) { // Determino il dexel - int nPos0 = j * m_nVNx[0] + i ; + int nPos0 = j * m_nNx[0] + i ; - m_TriZValues[0][nPos0].resize( 2) ; + m_Values[0][nPos0].resize( 2) ; // Aggiorno le quote estreme del segmento - m_TriZValues[0][nPos0][0] = 0 ; - m_TriZValues[0][nPos0][1] = dDimZ ; + m_Values[0][nPos0][0].dZVal = 0 ; + m_Values[0][nPos0][1].dZVal = dDimZ ; + m_Values[0][nPos0][0].vtN = - Z_AX ; + m_Values[0][nPos0][1].vtN = Z_AX ; } // Se tridexel riempio i singoli dexel della // griglia 2 con gli intervalli if ( bFlag) { - for ( size_t a = 0 ; a < m_nVNx[2] ; ++ a) { + for ( size_t a = 0 ; a < m_nNx[2] ; ++ a) { - size_t nPos2 = i * m_nVNx[2] + a ; + size_t nPos2 = i * m_nNx[2] + a ; - size_t nCurrentSize = m_TriZValues[2][nPos2].size( ) ; + size_t nCurrentSize = m_Values[2][nPos2].size( ) ; - m_TriZValues[2][nPos2].resize( nCurrentSize + 2) ; + m_Values[2][nPos2].resize( nCurrentSize + 2) ; - m_TriZValues[2][nPos2][nCurrentSize] = dt1 * dLengthY ; - m_TriZValues[2][nPos2][nCurrentSize + 1] = dt2 * dLengthY ; + m_Values[2][nPos2][nCurrentSize].dZVal = dt1 * dLengthY ; + m_Values[2][nPos2][nCurrentSize + 1].dZVal = dt2 * dLengthY ; + + Point3d ptP1 = ptP0 + dt1 * dLengthY * Y_AX ;//+ ( a + 0.5) * Z_AX ; // CAMBIATO CON EPS + Point3d ptP2 = ptP0 + dt2 * dLengthY * Y_AX ;//+ ( a + 0.5) * Z_AX ; // CAMBIATO CON EPS + + 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 ; + + m_Values[2][nPos2][nCurrentSize].vtN = 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 ; + + m_Values[2][nPos2][nCurrentSize+1].vtN = vtN2 ; + } + } + } } } } @@ -317,13 +367,13 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double // Se tridexel resta la griglia 1 if ( bFlag) { - for ( unsigned int i = 0 ; i < m_nVNx[1] ; ++ i) { + for ( unsigned int i = 0 ; i < m_nNx[1] ; ++ i) { // Definisco la retta da intersecare con la regione double dX = ( i + 0.5) * m_dStep ; - Point3d ptP0 = ptMapOrig + Vector3d( 0, dX, 0) ; + Point3d ptP0 = ptMapOrig + Vector3d( 0, dX, 0) ; ////// // CAMBIATO CON EPS CurveLine GridLine ; - GridLine.SetPVL( ptP0, X_AX, dLengthX) ; + GridLine.SetPVL( ptP0, X_AX, dLengthX ) ; //// // CAMBIATO CON EPS // Determino le intersezioni della retta con la regione CRVCVECTOR IntersectionResults ; @@ -344,16 +394,58 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double double dt1 = IntersectionResults[k].dParS ; double dt2 = IntersectionResults[k].dParE ; - for ( size_t j = 0 ; j < m_nVNy[1] ; ++ j) { + for ( size_t j = 0 ; j < m_nNy[1] ; ++ j) { - size_t nPos1 = j * m_nVNx[1] + i ; + size_t nPos1 = j * m_nNx[1] + i ; - size_t nCurrentSize = m_TriZValues[1][nPos1].size( ) ; + size_t nCurrentSize = m_Values[1][nPos1].size( ) ; - m_TriZValues[1][nPos1].resize( nCurrentSize + 2) ; + m_Values[1][nPos1].resize( nCurrentSize + 2) ; - m_TriZValues[1][nPos1][nCurrentSize] = dt1 * dLengthX ; - m_TriZValues[1][nPos1][nCurrentSize + 1] = dt2 * dLengthX ; + m_Values[1][nPos1][nCurrentSize].dZVal = dt1 * dLengthX ; // CAMBIATO CON EPS + m_Values[1][nPos1][nCurrentSize + 1].dZVal = dt2 * dLengthX ; // CAMBIATO CON EPS + + Point3d ptP1 = ptP0 + dt1 * dLengthX * X_AX ; /// cAMBIO + Point3d ptP2 = ptP0 + dt2 * dLengthX * X_AX ; // CAMBIATO CON EPS + + 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 ; + + m_Values[1][nPos1][nCurrentSize].vtN = 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 ; + + m_Values[1][nPos1][nCurrentSize+1].vtN = vtN2 ; + } + } + } } } } @@ -361,22 +453,22 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double } - m_dVMinZ[0] = 0 ; - m_dVMaxZ[0] = dDimZ ; + m_dMinZ[0] = 0 ; + m_dMaxZ[0] = dDimZ ; if ( bFlag) { - m_dVMinZ[1] = 0 ; - m_dVMaxZ[1] = dLengthX ; - m_dVMinZ[2] = 0 ; - m_dVMaxZ[2] = dLengthY ; + m_dMinZ[1] = 0 ; + m_dMaxZ[1] = dLengthX ; + m_dMinZ[2] = 0 ; + m_dMaxZ[2] = dLengthY ; } else { - m_dVMinZ[1] = 0 ; - m_dVMaxZ[1] = 0 ; - m_dVMinZ[2] = 0 ; - m_dVMaxZ[2] = 0 ; + m_dMinZ[1] = 0 ; + m_dMaxZ[1] = 0 ; + m_dMinZ[2] = 0 ; + m_dMaxZ[2] = 0 ; } // Ridimensiono e setto il vettore dei blocchi a falso @@ -390,15 +482,14 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double // Aggiornamento dello stato m_nStatus = OK ; -#endif + return true ; } //---------------------------------------------------------------------------- bool VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag) -{ -#if 0 +{ // Se la superficie non è chiusa non ha senso continuare if ( ! Surf.IsClosed()) return false ; @@ -428,23 +519,23 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag) // A partire dalle dimensioni di xy del grezzo determino il numero di colonne e righe // della griglia Zmap e da questi la dimensione del vettore di dexel - m_nVNx[0] = static_cast ( ceil( dLengthX / m_dStep)) ; - m_nVNy[0] = static_cast ( ceil( dLengthY / m_dStep)) ; + m_nNx[0] = static_cast ( floor( ( dLengthX + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; + m_nNy[0] = static_cast ( floor( ( dLengthY + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - m_nVDim[0] = m_nVNx[0] * m_nVNy[0] ; + m_nDim[0] = m_nNx[0] * m_nNy[0] ; // Ridimensiono il vettore di dexel e creo lo Zmap - m_TriZValues[0].resize( m_nVDim[0]) ; + m_Values[0].resize( m_nDim[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_nNx[0] / m_nDexNumPBlock + + ( m_nNx[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)) ; + m_nNy[0] / m_nDexNumPBlock + + ( m_nNy[0] % m_nDexNumPBlock >= m_nDexNumPBlock / 2 ? 1 : 0)) ; // Se Tridexel ridimensiono anche gli altri vettori if ( bFlag) { @@ -452,23 +543,23 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag) 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) ; - m_nVNx[1] = static_cast ( ceil( dLengthY / m_dStep)) ; - m_nVNy[1] = static_cast ( ceil( dLengthZ / m_dStep)) ; + m_nNx[1] = static_cast ( floor( ( dLengthY + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; + m_nNy[1] = static_cast ( floor( ( dLengthZ + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - m_nVDim[1] = m_nVNx[1] * m_nVNy[1] ; + m_nDim[1] = m_nNx[1] * m_nNy[1] ; - m_nVNx[2] = static_cast ( ceil( dLengthZ / m_dStep)) ; - m_nVNy[2] = static_cast ( ceil( dLengthX / m_dStep)) ; + m_nNx[2] = static_cast ( floor( ( dLengthZ + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; + m_nNy[2] = static_cast ( floor( ( dLengthX + 0.5 * m_dStep + EPS_SMALL) / m_dStep)) ; - m_nVDim[2] = m_nVNx[2] * m_nVNy[2] ; + m_nDim[2] = m_nNx[2] * m_nNy[2] ; - m_TriZValues[1].resize( m_nVDim[1]) ; - m_TriZValues[2].resize( m_nVDim[2]) ; + m_Values[1].resize( m_nDim[1]) ; + m_Values[2].resize( m_nDim[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)) ; + m_nNy[1] / m_nDexNumPBlock + + ( m_nNy[1] % m_nDexNumPBlock >= m_nDexNumPBlock / 2 ? 1 : 0)) ; } @@ -476,8 +567,8 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag) IntersParLinesSurfTm intPLSTM( m_MapFrame[0], Surf) ; // Determinazione e ridimensionamento dei dexel interni alla trimesh - for ( unsigned int i = 0 ; i < m_nVNx[0] ; ++ i) { - for ( unsigned int j = 0 ; j < m_nVNy[0] ; ++ j) { + for ( unsigned int i = 0 ; i < m_nNx[0] ; ++ i) { + for ( unsigned int j = 0 ; j < m_nNy[0] ; ++ j) { // Definisco la retta da intersecare con la trimesh double dX = ( i + 0.5) * m_dStep ; @@ -490,10 +581,12 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag) int nInt = int( IntersectionResults.size()) ; - unsigned int nPos = j * m_nVNx[0] + i ; + unsigned int nPos = j * m_nNx[0] + i ; bool bInside = false ; Point3d ptIn ; + Vector3d vtInN ; + for ( int k = 0 ; k < nInt ; ++ k) { int nIntType = IntersectionResults[k].nILTT ; @@ -508,6 +601,11 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag) ptIn = IntersectionResults[k].ptI ; + int nT = IntersectionResults[k].nT ; + int nF = Surf.GetFacetFromTria( nT) ; + + Surf.GetFacetNormal( nF, vtInN) ; + bInside = true ; } @@ -516,12 +614,22 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag) Point3d ptOut = IntersectionResults[k].ptI ; - unsigned int nCurrentSize = unsigned int( m_TriZValues[0][nPos].size()) ; - - m_TriZValues[0][nPos].resize( nCurrentSize + 2) ; + Vector3d vtOutN ; - m_TriZValues[0][nPos][nCurrentSize] = ptIn.z - ptMapOrig.z ; - m_TriZValues[0][nPos][nCurrentSize + 1] = ptOut.z - ptMapOrig.z ; + int nT = IntersectionResults[k].nT ; + int nF = Surf.GetFacetFromTria( nT) ; + + Surf.GetFacetNormal( nF, vtOutN) ; + + unsigned int nCurrentSize = unsigned int( m_Values[0][nPos].size()) ; + + m_Values[0][nPos].resize( nCurrentSize + 2) ; + + m_Values[0][nPos][nCurrentSize].dZVal = ptIn.z - ptMapOrig.z ; + m_Values[0][nPos][nCurrentSize + 1].dZVal = ptOut.z - ptMapOrig.z ; + + m_Values[0][nPos][nCurrentSize].vtN = vtInN ; + m_Values[0][nPos][nCurrentSize + 1].vtN = vtOutN ; bInside = false ; } @@ -535,8 +643,8 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag) IntersParLinesSurfTm intPLSTM1( m_MapFrame[1], Surf) ; // Determinazione e ridimensionamento dei dexel interni alla trimesh - for ( unsigned int i = 0 ; i < m_nVNx[1] ; ++ i) { - for ( unsigned int j = 0 ; j < m_nVNy[1] ; ++ j) { + for ( unsigned int i = 0 ; i < m_nNx[1] ; ++ i) { + for ( unsigned int j = 0 ; j < m_nNy[1] ; ++ j) { // Definisco la retta da intersecare con la trimesh double dX = ( i + 0.5) * m_dStep ; @@ -549,10 +657,12 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag) int nInt = int( IntersectionResults.size()) ; - unsigned int nPos = j * m_nVNx[1] + i ; + unsigned int nPos = j * m_nNx[1] + i ; bool bInside = false ; Point3d ptIn ; + Vector3d vtInN ; + for ( int k = 0 ; k < nInt ; ++ k) { int nIntType = IntersectionResults[k].nILTT ; @@ -567,6 +677,11 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag) ptIn = IntersectionResults[k].ptI ; + int nT = IntersectionResults[k].nT ; + int nF = Surf.GetFacetFromTria( nT) ; + + Surf.GetFacetNormal( nF, vtInN) ; + bInside = true ; } @@ -575,13 +690,23 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag) Point3d ptOut = IntersectionResults[k].ptI ; - unsigned int nCurrentSize = unsigned int( m_TriZValues[1][nPos].size()) ; + Vector3d vtOutN ; + + int nT = IntersectionResults[k].nT ; + int nF = Surf.GetFacetFromTria( nT) ; + + Surf.GetFacetNormal( nF, vtOutN) ; + + unsigned int nCurrentSize = unsigned int( m_Values[1][nPos].size()) ; - m_TriZValues[1][nPos].resize( nCurrentSize + 2) ; + m_Values[1][nPos].resize( nCurrentSize + 2) ; - m_TriZValues[1][nPos][nCurrentSize] = ptIn.x - ptMapOrig.x ; - m_TriZValues[1][nPos][nCurrentSize + 1] = ptOut.x - ptMapOrig.x ; + m_Values[1][nPos][nCurrentSize].dZVal = ptIn.x - ptMapOrig.x ; + m_Values[1][nPos][nCurrentSize + 1].dZVal = ptOut.x - ptMapOrig.x ; + m_Values[1][nPos][nCurrentSize].vtN = vtInN ; + m_Values[1][nPos][nCurrentSize + 1].vtN = vtOutN ; + bInside = false ; } } @@ -592,8 +717,8 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag) IntersParLinesSurfTm intPLSTM2( m_MapFrame[2], Surf) ; // Determinazione e ridimensionamento dei dexel interni alla trimesh - for ( unsigned int i = 0 ; i < m_nVNx[2] ; ++ i) { - for ( unsigned int j = 0 ; j < m_nVNy[2] ; ++ j) { + for ( unsigned int i = 0 ; i < m_nNx[2] ; ++ i) { + for ( unsigned int j = 0 ; j < m_nNy[2] ; ++ j) { // Definisco la retta da intersecare con la trimesh double dX = ( i + 0.5) * m_dStep ; @@ -606,10 +731,12 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag) int nInt = int( IntersectionResults.size()) ; - unsigned int nPos = j * m_nVNx[2] + i ; + unsigned int nPos = j * m_nNx[2] + i ; bool bInside = false ; Point3d ptIn ; + Vector3d vtInN ; + for ( int k = 0 ; k < nInt ; ++ k) { int nIntType = IntersectionResults[k].nILTT ; @@ -624,6 +751,11 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag) ptIn = IntersectionResults[k].ptI ; + int nT = IntersectionResults[k].nT ; + int nF = Surf.GetFacetFromTria( nT) ; + + Surf.GetFacetNormal( nF, vtInN) ; + bInside = true ; } @@ -632,12 +764,22 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag) Point3d ptOut = IntersectionResults[k].ptI ; - unsigned int nCurrentSize = unsigned int( m_TriZValues[2][nPos].size()) ; - - m_TriZValues[2][nPos].resize( nCurrentSize + 2) ; + Vector3d vtOutN ; - m_TriZValues[2][nPos][nCurrentSize] = ptIn.y - ptMapOrig.y ; - m_TriZValues[2][nPos][nCurrentSize + 1] = ptOut.y - ptMapOrig.y ; + int nT = IntersectionResults[k].nT ; + int nF = Surf.GetFacetFromTria( nT) ; + + Surf.GetFacetNormal( nF, vtOutN) ; + + unsigned int nCurrentSize = unsigned int( m_Values[2][nPos].size()) ; + + m_Values[2][nPos].resize( nCurrentSize + 2) ; + + m_Values[2][nPos][nCurrentSize].dZVal = ptIn.y - ptMapOrig.y ; + m_Values[2][nPos][nCurrentSize + 1].dZVal = ptOut.y - ptMapOrig.y ; + + m_Values[2][nPos][nCurrentSize].vtN = vtInN ; + m_Values[2][nPos][nCurrentSize + 1].vtN = vtOutN ; bInside = false ; } @@ -648,22 +790,22 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag) } // Assegno il minimo e massimo valore di Z della mappa - m_dVMinZ[0] = 0 ; - m_dVMaxZ[0] = dLengthZ ; + m_dMinZ[0] = 0 ; + m_dMaxZ[0] = dLengthZ ; if ( bFlag) { - m_dVMinZ[1] = 0 ; - m_dVMaxZ[1] = dLengthX ; - m_dVMinZ[2] = 0 ; - m_dVMaxZ[2] = dLengthY ; + m_dMinZ[1] = 0 ; + m_dMaxZ[1] = dLengthX ; + m_dMinZ[2] = 0 ; + m_dMaxZ[2] = dLengthY ; } else { - m_dVMinZ[1] = 0 ; - m_dVMaxZ[1] = 0 ; - m_dVMinZ[2] = 0 ; - m_dVMaxZ[2] = 0 ; + m_dMinZ[1] = 0 ; + m_dMaxZ[1] = 0 ; + m_dMinZ[2] = 0 ; + m_dMaxZ[2] = 0 ; } // Ridimensiono e setto il vettore dei blocchi a falso @@ -675,7 +817,7 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dPrec, bool bFlag) m_BlockToUpdate[nCount] = true ; - m_nStatus = OK ; -#endif + m_nStatus = OK ; + return true ; } \ No newline at end of file