diff --git a/VolZmapGraphics.cpp b/VolZmapGraphics.cpp index 34f79bb..80a3c16 100644 --- a/VolZmapGraphics.cpp +++ b/VolZmapGraphics.cpp @@ -64,8 +64,9 @@ TestOnNormal( const AppliedVector CompoField[], int nCompoElem) } // Se la massima deviazione non supera il limite non è feature - const double SHARP_COS = 0.866 ; - if ( dMinCosTheta >= SHARP_COS) + const double SHARP_COS_SUP = 0.866 ; + const double SHARP_COS_INF = - 0.985 ; // - 0.6 + if ( dMinCosTheta >= SHARP_COS_SUP || dMinCosTheta <= SHARP_COS_INF) return NO_FEATURE ; // Verifico se Edge o Corner @@ -1405,9 +1406,6 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV for ( int j = nLimits[2] ; j < nLimits[3] ; ++ j) { for ( int k = nLimits[4] ; k < nLimits[5] ; ++ k) { - /* if ( ! ( j >= 2 && j <= 8) ) - continue ;*/ - // Classificazione dei vertici: interni o esterni al materiale int nIndex = CalcIndex( i, j, k) ; @@ -1554,18 +1552,27 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV if ( bReg) { // Configurazione 3 if ( nAllConfig[nIndex] == 3) { - // Verifico concordanza tra i versori di una stessa componente - // (ogni coppia di vettori di una medesima componente deve avere prodotto scalare non inferiore a 0.7) - Vector3d vtCmpAvg0, vtCmpAvg1 ; - bool bTest0 = DotTest( CompoVert[0], 3, vtCmpAvg0, 0.7) ; - bool bTest1 = DotTest( CompoVert[1], 3, vtCmpAvg1, 0.7) ; - // Se i versori di entrambe le componenti sono concordi ha senso parlare di vettori medi. - // Altrimenti assegno al loro prodotto scalare un valore assurdo come -2 - double dScProd = - 2 ; - if ( bTest0 && bTest1) - dScProd = vtCmpAvg0 * vtCmpAvg1 ; + // Test sulla topologia + + double dDotSum = 0 ; + for ( int nFV = 0 ; nFV < 3 ; ++ nFV) { + for ( int nTV = 0 ; nTV < 2 ; ++ nTV) { + dDotSum += CompoVert[0][nFV].vtVec * CompoVert[1][nTV].vtVec ; + } + } + for ( int nFVI = 0 ; nFVI < 2 ; ++ nFVI) { + for ( int nFVJ = nFVI + 1 ; nFVJ < 3 ; ++ nFVJ) { + dDotSum -= CompoVert[0][nFVI].vtVec * CompoVert[0][nFVJ].vtVec ; + } + } + for ( int nTVI = 0 ; nTVI < 2 ; ++ nTVI) { + for ( int nTVJ = nTVI + 1 ; nTVJ < 3 ; ++ nTVJ) { + dDotSum -= CompoVert[1][nTVI].vtVec * CompoVert[1][nTVJ].vtVec ; + } + } + bool bTestOnSum = dDotSum > 0 ; // Si passa alla seconda topologia - if ( ! ( bTest0 && bTest1) || ( bTest0 && bTest1 && dScProd > 0.7)) { + if ( bTestOnSum) { // Ricerca del caso corrispondente della nuova topologia int nt = 0 ; while ( nIndexVsIndex3[nt][0] != nIndex)