EgtGeomKernel 1.9e5 :

- correzione calcolo triangoli di superficie Zmap (caso speciale 6 ExtMC).
This commit is contained in:
Dario Sassi
2018-05-23 17:29:36 +00:00
parent 67cd4ef923
commit 844a0277ff
3 changed files with 193 additions and 149 deletions
+70 -47
View File
@@ -943,9 +943,9 @@ VolZmap::ProcessCube( int nVoxI, int nVoxJ, int nVoxK, TRIA3DEXLIST& lstTria, Vo
// Costruzione dei triangoli
for ( int TriIndex = 0 ; TriIndex < 15 ; TriIndex += 3) {
// Indici vertici
int i0 = Cases6Plus[nRotCase][TriIndex + 2] ;
int i1 = Cases6Plus[nRotCase][TriIndex + 1] ;
int i2 = Cases6Plus[nRotCase][TriIndex] ;
int i0 = Cases6Plus[nRotCase][0][TriIndex + 2] ;
int i1 = Cases6Plus[nRotCase][0][TriIndex + 1] ;
int i2 = Cases6Plus[nRotCase][0][TriIndex] ;
// Costruzione triangolo
Triangle3dEx CurrentTriangle ;
CurrentTriangle.Set( VecField[i0].ptPApp, VecField[i1].ptPApp, VecField[i2].ptPApp) ;
@@ -1541,51 +1541,74 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV
++ nt ;
int nRotCase = nIndexVsIndex6[nt][1] ;
// Costruzione dei triangoli
for ( int TriIndex = 0 ; TriIndex < 15 ; TriIndex += 3) {
// Indici vertici
int i0 = Cases6Plus[nRotCase][TriIndex + 2] ;
int i1 = Cases6Plus[nRotCase][TriIndex + 1] ;
int i2 = Cases6Plus[nRotCase][TriIndex] ;
// Costruzione triangolo
Triangle3dEx CurrentTriangle ;
CurrentTriangle.Set( VecField[i0].ptPApp, VecField[i1].ptPApp, VecField[i2].ptPApp) ;
CurrentTriangle.Validate( true) ;
CurrentTriangle.SetVertexNorm( 0, VecField[i0].vtVec) ;
CurrentTriangle.SetVertexNorm( 1, VecField[i1].vtVec) ;
CurrentTriangle.SetVertexNorm( 2, VecField[i2].vtVec) ;
// Setto il numero di utensile (conta solo positivo, nullo o negativo)
int nTool0 = Clamp( VecField[i0].nPropIndex, -1, 1) ;
int nTool1 = Clamp( VecField[i1].nPropIndex, -1, 1) ;
int nTool2 = Clamp( VecField[i2].nPropIndex, -1, 1) ;
if ( nTool0 == nTool1 || nTool0 == nTool2)
CurrentTriangle.SetGrade( nTool0) ;
else if ( nTool1 == nTool2)
CurrentTriangle.SetGrade( nTool1) ;
// Valido il triangolo e setto le normali del campo vettoriale ai corrispondenti vertici
if ( CurrentTriangle.Validate( true)) {
Vector3d vtVertNorm = VecField[i0].vtVec ;
if ( CurrentTriangle.GetN() * vtVertNorm > 0.6)
CurrentTriangle.SetVertexNorm( 0, vtVertNorm) ;
else
CurrentTriangle.SetVertexNorm( 0, CurrentTriangle.GetN()) ;
vtVertNorm = VecField[i1].vtVec ;
if ( CurrentTriangle.GetN() * vtVertNorm > 0.6)
CurrentTriangle.SetVertexNorm( 1, vtVertNorm) ;
else
CurrentTriangle.SetVertexNorm( 1, CurrentTriangle.GetN()) ;
vtVertNorm = VecField[i2].vtVec ;
if ( CurrentTriangle.GetN() * vtVertNorm > 0.6)
CurrentTriangle.SetVertexNorm( 2, vtVertNorm) ;
else
CurrentTriangle.SetVertexNorm( 2, CurrentTriangle.GetN()) ;
//// Costruzione dei triangoli
//for ( int TriIndex = 0 ; TriIndex < 15 ; TriIndex += 3) {
// // Indici vertici
// int i0 = Cases6Plus[nRotCase][TriIndex + 2] ;
// int i1 = Cases6Plus[nRotCase][TriIndex + 1] ;
// int i2 = Cases6Plus[nRotCase][TriIndex] ;
// // Costruzione triangolo
// Triangle3dEx CurrentTriangle ;
// CurrentTriangle.Set( VecField[i0].ptPApp, VecField[i1].ptPApp, VecField[i2].ptPApp) ;
// CurrentTriangle.Validate( true) ;
// CurrentTriangle.SetVertexNorm( 0, VecField[i0].vtVec) ;
// CurrentTriangle.SetVertexNorm( 1, VecField[i1].vtVec) ;
// CurrentTriangle.SetVertexNorm( 2, VecField[i2].vtVec) ;
// // Setto il numero di utensile (conta solo positivo, nullo o negativo)
// int nTool0 = Clamp( VecField[i0].nPropIndex, -1, 1) ;
// int nTool1 = Clamp( VecField[i1].nPropIndex, -1, 1) ;
// int nTool2 = Clamp( VecField[i2].nPropIndex, -1, 1) ;
// if ( nTool0 == nTool1 || nTool0 == nTool2)
// CurrentTriangle.SetGrade( nTool0) ;
// else if ( nTool1 == nTool2)
// CurrentTriangle.SetGrade( nTool1) ;
// // Valido il triangolo e setto le normali del campo vettoriale ai corrispondenti vertici
// if ( CurrentTriangle.Validate( true)) {
// Vector3d vtVertNorm = VecField[i0].vtVec ;
// if ( CurrentTriangle.GetN() * vtVertNorm > 0.6)
// CurrentTriangle.SetVertexNorm( 0, vtVertNorm) ;
// else
// CurrentTriangle.SetVertexNorm( 0, CurrentTriangle.GetN()) ;
// vtVertNorm = VecField[i1].vtVec ;
// if ( CurrentTriangle.GetN() * vtVertNorm > 0.6)
// CurrentTriangle.SetVertexNorm( 1, vtVertNorm) ;
// else
// CurrentTriangle.SetVertexNorm( 1, CurrentTriangle.GetN()) ;
// vtVertNorm = VecField[i2].vtVec ;
// if ( CurrentTriangle.GetN() * vtVertNorm > 0.6)
// CurrentTriangle.SetVertexNorm( 2, vtVertNorm) ;
// else
// CurrentTriangle.SetVertexNorm( 2, CurrentTriangle.GetN()) ;
// }
// // Riporto il triangolo nel sistema in cui è immerso quello dello Zmap
// CurrentTriangle.ToGlob( m_MapFrame) ;
// // Aggiungo alla lista
// lstTria.emplace_back( CurrentTriangle) ;
//}
//continue ;
// Aggiorno numero di componenti
nComponents = Cases6Plus[nRotCase][1][0] ;
// Riaggiorno gli offsets
nExtTabOff = nComponents ;
nStdTabOff = 0 ;
// Modifico le matrici
for ( int nC = 1 ; nC <= nComponents ; ++ nC) {
// Numero vertici per componenti
nVertComp[nC - 1] = Cases6Plus[nRotCase][1][nC] ;
// Matrice dei vertici della base del fan
for ( int nFanVert = 0 ; nFanVert < nVertComp[nC - 1] ; ++ nFanVert)
CompoVert[nC - 1][nFanVert] = VecField[Cases6Plus[nRotCase][1][nFanVert + nExtTabOff + 1]] ;
// Matrici dei vertici dei triangoli in assenza di sharp feature
for ( int nTriVert = 0 ; nTriVert < 3 * ( nVertComp[nC - 1] - 2) ; nTriVert += 3) {
CompoTriVert[nC - 1][nTriVert] = VecField[Cases6Plus[nRotCase][0][nStdTabOff + nTriVert+2]] ;
CompoTriVert[nC - 1][nTriVert+1] = VecField[Cases6Plus[nRotCase][0][nStdTabOff + nTriVert+1]] ;
CompoTriVert[nC - 1][nTriVert+2] = VecField[Cases6Plus[nRotCase][0][nStdTabOff + nTriVert]] ;
}
// Riporto il triangolo nel sistema in cui è immerso quello dello Zmap
CurrentTriangle.ToGlob( m_MapFrame) ;
// Aggiungo alla lista
lstTria.emplace_back( CurrentTriangle) ;
}
continue ;
// Aggiorno gli offsets per raggiungere i vertici della componente successiva.
nExtTabOff += nVertComp[nC - 1] ;
nStdTabOff += 3 * ( nVertComp[nC - 1] - 2) ;
}
}
}