EgtGeomKernel 1.9b3 :

- modifiche per Zmap.
This commit is contained in:
Dario Sassi
2018-02-14 08:02:14 +00:00
parent 856b928ff7
commit 01886cc428
2 changed files with 110 additions and 65 deletions
+110 -65
View File
@@ -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 ;