From 01886cc428958e444c99ddc5f8fde5aed5178d36 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Wed, 14 Feb 2018 08:02:14 +0000 Subject: [PATCH] EgtGeomKernel 1.9b3 : - modifiche per Zmap. --- EgtGeomKernel.rc | Bin 11710 -> 11710 bytes VolZmapGraphics.cpp | 175 ++++++++++++++++++++++++++++---------------- 2 files changed, 110 insertions(+), 65 deletions(-) diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 430adc4d2725339a31a13f7cb3509ad06fbc3f1c..666d9cc6566b2563b3919d32ff796df7da368258 100644 GIT binary patch delta 94 zcmdlNy)SyhFE&Qw&A-_cnHh~ID{|{@_Trkr0u;H;XNwSVW8B;$>;>dw2zN+>g;Df- LFmBFL4&ed-W11TR delta 94 zcmdlNy)SyhFE&P_&A-_cnHh~HD{|{@_Trkr0u;H;XNwSVW8B;$>;>dw2zN+>g;Df- LFmBFL4&ed-Vf-5U diff --git a/VolZmapGraphics.cpp b/VolZmapGraphics.cpp index f28743b..21808c7 100644 --- a/VolZmapGraphics.cpp +++ b/VolZmapGraphics.cpp @@ -1648,7 +1648,7 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold for ( int i = nLimits[0] ; i < nLimits[1] ; ++ i) { for ( int j = nLimits[2] ; j < nLimits[3] ; ++ j) { for ( int k = nLimits[4] ; k < nLimits[5] ; ++ k) { - + // Classificazione dei vertici: interni o esterni al materiale int nIndex = CalcIndex( i, j, k) ; @@ -1954,7 +1954,7 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold GridControl( VecField, CompoVert, nIndArrey, nVertComp, nCompCount, bGridControl) ; // Flag ExtMC - bool bExtMC = ( nFeatureType != NO_FEATURE && bGridControl) ; + bool bExtMC = ( nFeatureType != NO_FEATURE /*&& bGridControl*/) ; // Extended MC if ( bExtMC) { @@ -2065,7 +2065,7 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold // Setto le normali a ogni vertice CurrentTriangle.SetVertexNorm( 1, CompoVert[nCompCount - 1][nj].vtNorm) ; CurrentTriangle.SetVertexNorm( 2, CompoVert[nCompCount - 1][ni].vtNorm) ; - if ( CurrentTriangle.GetVertexNorm( 1) * CurrentTriangle.GetVertexNorm( 2) > 0) + if ( CurrentTriangle.GetVertexNorm( 1) * CurrentTriangle.GetVertexNorm( 2) > 0.5) CurrentTriangle.SetVertexNorm( 0, 0.5 * ( CurrentTriangle.GetVertexNorm( 1) + CurrentTriangle.GetVertexNorm( 2))) ; // Valido il triangolo @@ -2157,7 +2157,7 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold CurrentTriangle.SetAttrib( 2, CompoVert[nCompCount - 1][ni].nToolFlag) ; CurrentTriangle.SetVertexNorm( 1, CompoVert[nCompCount - 1][nj].vtNorm) ; CurrentTriangle.SetVertexNorm( 2, CompoVert[nCompCount - 1][ni].vtNorm) ; - if ( CurrentTriangle.GetVertexNorm( 1) * CurrentTriangle.GetVertexNorm( 2) > 0) + if ( CurrentTriangle.GetVertexNorm( 1) * CurrentTriangle.GetVertexNorm( 2) > 0.5) CurrentTriangle.SetVertexNorm( 0, 0.5 * ( CurrentTriangle.GetVertexNorm( 1) + CurrentTriangle.GetVertexNorm( 2))) ; // Valido il triangolo @@ -2246,7 +2246,7 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold CurrentTriangle.SetAttrib( 2, CompoVert[nCompCount - 1][ni].nToolFlag) ; CurrentTriangle.SetVertexNorm( 1, CompoVert[nCompCount - 1][nj].vtNorm) ; CurrentTriangle.SetVertexNorm( 2, CompoVert[nCompCount - 1][ni].vtNorm) ; - if ( CurrentTriangle.GetVertexNorm( 1) * CurrentTriangle.GetVertexNorm( 2) > 0) + if ( CurrentTriangle.GetVertexNorm( 1) * CurrentTriangle.GetVertexNorm( 2) > 0.5) CurrentTriangle.SetVertexNorm( 0, 0.5 * ( CurrentTriangle.GetVertexNorm( 1) + CurrentTriangle.GetVertexNorm( 2))) ; CurrentTriangle.Validate( true) ; @@ -2305,7 +2305,7 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold bool bBoundary = IsAVoxelOnBoundary( nLimits, nVoxIndexes, true) ; TRIA3DEXVECTOR vInnerTriaTemp, vBorderTriaTemp ; - + for ( int ni = 0 ; ni < nContSize ; ++ ni) { // Se l'area è non nulla aggiungo il triangolo a uno dei due vettori. @@ -2317,7 +2317,7 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold if ( ! bBoundary || ! bTriangleOnBorder) vInnerTriaTemp.emplace_back( triContainer[ni]) ; else - vBorderTriaTemp.emplace_back( triContainer[ni]) ; + vBorderTriaTemp.emplace_back( triContainer[ni]) ; } } @@ -2379,7 +2379,8 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold // voxel, ridimensiono il vettore che contiene // la struttura dati del voxel. if ( nBorderFeatureInVoxel == 1) { - m_InterBlockTria[nBlock].resize( m_InterBlockTria[nBlock].size() + 1) ; + // Aggiungo un voxel al blocco per i triangoli + m_InterBlockTria[nBlock].resize( m_InterBlockTria[nBlock].size() + 1) ; // Questi dati dipendono solo dal voxel int nCurrent = int( m_InterBlockTria[nBlock].size()) - 1 ; m_InterBlockTria[nBlock][nCurrent].i = i ; @@ -2397,11 +2398,11 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold int nNewFeatureNum = nOldFeatureNum + 1 ; // Aggiungo una componente per il vettore dei triangoli della componente connessa - m_InterBlockTria[nBlock][nCurrent].vCompoTria.resize( nNewFeatureNum) ; + m_InterBlockTria[nBlock][nCurrent].vCompoTria.resize( nNewFeatureNum) ; for ( int ni = 0 ; ni < int( vBorderTriaTemp.size()) ; ++ ni) { // Riporto le coordinate nel sistema in cui è immerso lo Zmap vBorderTriaTemp[ni].ToGlob( m_MapFrame) ; - m_InterBlockTria[nBlock][nCurrent].vCompoTria[nOldFeatureNum].emplace_back( vBorderTriaTemp[ni]) ; + m_InterBlockTria[nBlock][nCurrent].vCompoTria[nOldFeatureNum].emplace_back( vBorderTriaTemp[ni]) ; } } } @@ -2689,43 +2690,45 @@ VolZmap::FlipEdgesII( TriHolder& TriHold) const } else { // In questo caso i due triangoli sono necessariamente su un piano, - // quindi hanno normali concordi. Per ognuno dei due cerco nei rispettivi - // ventagli un triangolo con normale concorde con colore definito. Assegno - // tale colore ai triangoli. - int nPrv1 = ( nTri1 != 0 ? nTri1 : int( TriHold[n1].vCompoTria[nCompo1].size())) - 1 ; - int nNxt1 = ( nTri1 != TriHold[n1].vCompoTria[nCompo1].size() - 1 ? nTri1 + 1 : 0) ; - int nPrv2 = ( nTri2 != 0 ? nTri2 : int( TriHold[n2].vCompoTria[nCompo2].size())) - 1 ; - int nNxt2 = ( nTri2 != TriHold[n2].vCompoTria[nCompo2].size() - 1 ? nTri2 + 1 : 0) ; - // Prodotti scalari del primo triangolo con i suoi adiacenti - double dDotP1 = TriHold[n1].vCompoTria[nCompo1][nTri1].GetN() * - TriHold[n1].vCompoTria[nCompo1][nPrv1].GetN() ; - double dDotN1 = TriHold[n1].vCompoTria[nCompo1][nTri1].GetN() * - TriHold[n1].vCompoTria[nCompo1][nNxt1].GetN() ; - // Prendo il maggiore fra i due, e comunque maggiore di 0.5 - int nAdjT1 = - 1 ; - if ( dDotP1 > 0.5 || dDotN1 > 0.5) - nAdjT1 = ( dDotP1 > dDotN1 ? nPrv1 : nNxt1) ; - // Prodotti scalari del primo triangolo con i suoi adiacenti - double dDotP2 = TriHold[n2].vCompoTria[nCompo2][nTri2].GetN() * - TriHold[n2].vCompoTria[nCompo2][nPrv2].GetN() ; - double dDotN2 = TriHold[n2].vCompoTria[nCompo2][nTri2].GetN() * - TriHold[n2].vCompoTria[nCompo2][nNxt2].GetN() ; - // Prendo il maggiore fra i due, e comunque maggiore di 0.5 - int nAdjT2 = - 1 ; - if ( dDotP2 > 0.5 || dDotN2 > 0.5) - nAdjT2 = ( dDotP2 > dDotN2 ? nPrv2 : nNxt2) ; - // Se abbiamo trovato triangoli adiacenti validi - // assegnamo il colorea quelli correnti. - if ( nAdjT1 != - 1) { - int nCol = TriHold[n1].vCompoTria[nCompo1][nAdjT1].GetGrade() ; - TriHold[n1].vCompoTria[nCompo1][nTri1].SetGrade( nCol) ; - TriHold[n2].vCompoTria[nCompo2][nTri2].SetGrade( nCol) ; + // quindi hanno normali concordi. A entrambi assegno il colore del vertice con + // normale più concorde a quella del triangolo + double dDotVec[4] ; + dDotVec[0] = TriHold[n1].vCompoTria[nCompo1][nTri1].GetN() * + TriHold[n1].vCompoTria[nCompo1][nTri1].GetVertexNorm( 1) ; + dDotVec[1] = TriHold[n2].vCompoTria[nCompo2][nTri2].GetN() * + TriHold[n2].vCompoTria[nCompo2][nTri2].GetVertexNorm( 2) ; + dDotVec[2] = TriHold[n1].vCompoTria[nCompo1][nTri1].GetN() * + TriHold[n1].vCompoTria[nCompo1][nTri1].GetVertexNorm( 2) ; + dDotVec[3] = TriHold[n2].vCompoTria[nCompo2][nTri2].GetN() * + TriHold[n2].vCompoTria[nCompo2][nTri2].GetVertexNorm( 1) ; + // Cerco il massimo dei prodotti scalari + int nMaxPos = 0 ; + double dMaxDot = - 1 ; + for ( int nPos = 0 ; nPos < 4 && dMaxDot < 1 ; ++ nPos) { + if ( dDotVec[nPos] > dMaxDot) { + dMaxDot = dDotVec[nPos] ; + nMaxPos = nPos ; + } } - else if ( nAdjT2 != - 1) { - int nCol = TriHold[n2].vCompoTria[nCompo2][nAdjT2].GetGrade() ; - TriHold[n1].vCompoTria[nCompo1][nTri1].SetGrade( nCol) ; - TriHold[n2].vCompoTria[nCompo2][nTri2].SetGrade( nCol) ; - } + // Trovo il colore associato al vertice di massimo prodotto scalare + int nCol ; + switch ( nMaxPos) { + case 0 : + nCol = TriHold[n1].vCompoTria[nCompo1][nTri1].GetAttrib( 1) ; + break ; + case 1 : + nCol = TriHold[n2].vCompoTria[nCompo2][nTri2].GetAttrib( 2) ; + break ; + case 2 : + nCol = TriHold[n1].vCompoTria[nCompo1][nTri1].GetAttrib( 2) ; + break ; + case 3 : + nCol = TriHold[n2].vCompoTria[nCompo2][nTri2].GetAttrib( 1) ; + break ; + } + // Assegno il colore ai triangoli + TriHold[n1].vCompoTria[nCompo1][nTri1].SetGrade( nCol) ; + TriHold[n2].vCompoTria[nCompo2][nTri2].SetGrade( nCol) ; } } } @@ -2825,27 +2828,69 @@ VolZmap::FlipEdgesBB( TriaMatrix& InterTria) const } // Se non vi è inversione eseguo il flipping if ( ! bInv) { - // Vertice condiviso fra nTri1 e quello del suo fan - int nColF = InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].GetAttrib( 2) ; - int nColL = InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].GetAttrib( 2) ; - // modifico punti e colori - InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].SetP( 1, InterTria[tLB][tVLB].ptCompoVert[tCmpL]) ; - InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].SetP( 1, InterTria[tFB][tVFB].ptCompoVert[tCmpF]) ; + // Vertice condiviso fra nTri1 e quello del suo fan + int nColF = InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].GetAttrib( 2) ; + int nColL = InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].GetAttrib( 2) ; + // modifico punti e colori + InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].SetP( 1, InterTria[tLB][tVLB].ptCompoVert[tCmpL]) ; + InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].SetP( 1, InterTria[tFB][tVFB].ptCompoVert[tCmpF]) ; InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].SetGrade( nColF) ; InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].SetGrade( nColL) ; // Valido i triangoli InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].Validate( true) ; InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].Validate( true) ; - // Setto le normali a ogni vertice - Vector3d vtNormF = InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].GetVertexNorm( 2) ; - Vector3d vtNormL = InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].GetVertexNorm( 2) ; - InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].SetVertexNorm( 1, vtNormF) ; - InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].SetVertexNorm( 0, vtNormF) ; - InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].SetVertexNorm( 1, vtNormL) ; - InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].SetVertexNorm( 0, vtNormL) ; + // Setto le normali a ogni vertice + Vector3d vtNormF = InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].GetVertexNorm( 2) ; + Vector3d vtNormL = InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].GetVertexNorm( 2) ; + InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].SetVertexNorm( 1, vtNormF) ; + InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].SetVertexNorm( 0, vtNormF) ; + InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].SetVertexNorm( 1, vtNormL) ; + InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].SetVertexNorm( 0, vtNormL) ; bModified = true ; break ; } + else { + // In questo caso i due triangoli sono necessariamente su un piano, + // quindi hanno normali concordi. A entrambi assegno il colore del vertice con + // normale più concorde a quella del triangolo + double dDotVec[4] ; + dDotVec[0] = InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].GetN() * + InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].GetVertexNorm( 1) ; + dDotVec[1] = InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].GetN() * + InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].GetVertexNorm( 2) ; + dDotVec[2] = InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].GetN() * + InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].GetVertexNorm( 2) ; + dDotVec[3] = InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].GetN() * + InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].GetVertexNorm( 1) ; + // Cerco il massimo dei prodotti scalari + int nMaxPos = 0 ; + double dMaxDot = - 1 ; + for ( int nPos = 0 ; nPos < 4 && dMaxDot < 1 ; ++ nPos) { + if ( dDotVec[nPos] > dMaxDot) { + dMaxDot = dDotVec[nPos] ; + nMaxPos = nPos ; + } + } + // Trovo il colore associato al vertice di massimo prodotto scalare + int nCol ; + switch ( nMaxPos) { + case 0 : + nCol = InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].GetAttrib( 1) ; + break ; + case 1 : + nCol = InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].GetAttrib( 2) ; + break ; + case 2 : + nCol = InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].GetAttrib( 2) ; + break ; + case 3 : + nCol = InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].GetAttrib( 1) ; + break ; + } + // Assegno il colore ai triangoli + InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].SetGrade( nCol) ; + InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].SetGrade( nCol) ; + } } } if ( bModified) @@ -2965,7 +3010,7 @@ VolZmap::IntersPos( int nVec1[], int nVec2[], bool bFirstCorner, VectorField& vf double dX = m_Values[1][nDexel][n].dMax ; while ( n >= 0 && dX > dMinX - dEps) { if ( dX < dMaxX + dEps) { - vfField.ptInt.x = dX ; + vfField.ptInt.x = Clamp( dX, dMinX + EPS_SMALL, dMaxX - EPS_SMALL) ; vfField.vtNorm = m_Values[1][nDexel][n].vtMaxN ; vfField.nToolFlag = m_Values[1][nDexel][n].nToolMax ; bFound = true ; @@ -2982,7 +3027,7 @@ VolZmap::IntersPos( int nVec1[], int nVec2[], bool bFirstCorner, VectorField& vf double dX = m_Values[1][nDexel][n].dMin ; while ( n < nSize && dX < dMaxX + dEps) { if ( dX > dMinX - dEps) { - vfField.ptInt.x = dX ; + vfField.ptInt.x = Clamp( dX, dMinX + EPS_SMALL, dMaxX - EPS_SMALL) ; vfField.vtNorm = m_Values[1][nDexel][n].vtMinN ; vfField.nToolFlag = m_Values[1][nDexel][n].nToolMin ; bFound = true ; @@ -3017,7 +3062,7 @@ VolZmap::IntersPos( int nVec1[], int nVec2[], bool bFirstCorner, VectorField& vf double dY = m_Values[2][nDexel][n].dMax ; while ( n >= 0 && dY > dMinY - dEps) { if ( dY < dMaxY + dEps) { - vfField.ptInt.y = dY ; + vfField.ptInt.y = Clamp( dY, dMinY + EPS_SMALL, dMaxY - EPS_SMALL) ; vfField.vtNorm = m_Values[2][nDexel][n].vtMaxN ; vfField.nToolFlag = m_Values[2][nDexel][n].nToolMax; bFound = true ; @@ -3034,7 +3079,7 @@ VolZmap::IntersPos( int nVec1[], int nVec2[], bool bFirstCorner, VectorField& vf double dY = m_Values[2][nDexel][n].dMin ; while ( n < nSize && dY < dMaxY + dEps) { if ( dY > dMinY - dEps) { - vfField.ptInt.y = dY ; + vfField.ptInt.y = Clamp( dY, dMinY + EPS_SMALL, dMaxY - EPS_SMALL) ; vfField.vtNorm = m_Values[2][nDexel][n].vtMinN ; vfField.nToolFlag = m_Values[2][nDexel][n].nToolMin ; bFound = true ; @@ -3069,7 +3114,7 @@ VolZmap::IntersPos( int nVec1[], int nVec2[], bool bFirstCorner, VectorField& vf double dZ = m_Values[0][nDexel][n].dMax ; while ( n >= 0 && dZ > dMinZ - dEps) { if ( dZ < dMaxZ + dEps) { - vfField.ptInt.z = dZ ; + vfField.ptInt.z = Clamp( dZ, dMinZ + EPS_SMALL, dMaxZ - EPS_SMALL) ; vfField.vtNorm = m_Values[0][nDexel][n].vtMaxN ; vfField.nToolFlag = m_Values[0][nDexel][n].nToolMax ; bFound = true ; @@ -3086,7 +3131,7 @@ VolZmap::IntersPos( int nVec1[], int nVec2[], bool bFirstCorner, VectorField& vf double dZ = m_Values[0][nDexel][n].dMin ; while ( n < nSize && dZ < dMaxZ + dEps) { if ( dZ > dMinZ - dEps) { - vfField.ptInt.z = dZ ; + vfField.ptInt.z = Clamp( dZ, dMinZ + EPS_SMALL, dMaxZ - EPS_SMALL) ; vfField.vtNorm = m_Values[0][nDexel][n].vtMinN ; vfField.nToolFlag = m_Values[0][nDexel][n].nToolMin ; bFound = true ;