EgtGeomKernel :

- migliorie per visualizzazione smussata di Zmap.
This commit is contained in:
Dario Sassi
2018-01-22 19:13:07 +00:00
parent 38676b65c3
commit 2fe052428c
2 changed files with 80 additions and 22 deletions
+78 -20
View File
@@ -1950,10 +1950,13 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold
int i1 = Cases6Plus[nRotCase][TriIndex + 1] ;
int i2 = Cases6Plus[nRotCase][TriIndex] ;
Triangle3d CurrentTriangle ;
Triangle3dEx CurrentTriangle ;
// Il triangolo è pronto
CurrentTriangle.Set( VecField[i0].ptInt, VecField[i1].ptInt, VecField[i2].ptInt) ;
CurrentTriangle.SetVertexNorm( 0, VecField[i0].vtNorm) ;
CurrentTriangle.SetVertexNorm( 1, VecField[i1].vtNorm) ;
CurrentTriangle.SetVertexNorm( 2, VecField[i2].vtNorm) ;
bool bV = CurrentTriangle.Validate( true) ;
CurrentTriangle.ToGlob( m_MapFrame) ;
@@ -2098,16 +2101,19 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold
bOutside = ( dDistFeature > MAX_DIST) ;
}
TRIA3DVECTOR triContainer ;
TRIA3DEXVECTOR triContainer ;
// Costruisco triangoli di prova
for ( int ni = 0 ; ni < nVertComp[nCompCount - 1] ; ++ ni) {
int nj = ( ni + 1 < nVertComp[nCompCount - 1]) ? ni + 1 : 0 ;
// Il triangolo è pronto
Triangle3d CurrentTriangle ;
Triangle3dEx CurrentTriangle ;
// Setto i punti
CurrentTriangle.Set( ptSol, CompoVert[nCompCount - 1][nj].ptInt, CompoVert[nCompCount - 1][ni].ptInt) ;
// Setto il numero di utensile ai vertici di base del fan
CurrentTriangle.SetAttrib( 1, CompoVert[nCompCount - 1][nj].nToolFlag) ;
CurrentTriangle.SetAttrib( 2, CompoVert[nCompCount - 1][ni].nToolFlag) ;
// Setto il numero di utensile al triangolo nel complesso
if ( CurrentTriangle.GetAttrib( 1) < 0 ||
CurrentTriangle.GetAttrib( 2) < 0)
CurrentTriangle.SetGrade( - 1) ;
@@ -2116,7 +2122,12 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold
CurrentTriangle.SetGrade( 1) ;
else
CurrentTriangle.SetGrade( 0) ;
// Valido il triangolo
CurrentTriangle.Validate( true) ;
// Setto le normali a ogni vertice
CurrentTriangle.SetVertexNorm( 0, CurrentTriangle.GetN()) ;
CurrentTriangle.SetVertexNorm( 1, CompoVert[nCompCount - 1][nj].vtNorm) ;
CurrentTriangle.SetVertexNorm( 2, CompoVert[nCompCount - 1][ni].vtNorm) ;
// Aggiungo triangolo al vettore temporaneo
triContainer.emplace_back( CurrentTriangle) ;
}
@@ -2198,7 +2209,7 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold
for ( int ni = 0 ; ni < nVertComp[nCompCount - 1] ; ++ ni) {
int nj = ( ni + 1 < nVertComp[nCompCount - 1]) ? ni + 1 : 0 ;
// Il triangolo è pronto
Triangle3d CurrentTriangle ;
Triangle3dEx CurrentTriangle ;
CurrentTriangle.Set( ptSol, CompoVert[nCompCount - 1][nj].ptInt, CompoVert[nCompCount - 1][ni].ptInt) ;
CurrentTriangle.SetAttrib( 1, CompoVert[nCompCount - 1][nj].nToolFlag) ;
CurrentTriangle.SetAttrib( 2, CompoVert[nCompCount - 1][ni].nToolFlag) ;
@@ -2281,7 +2292,7 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold
for ( int ni = 0 ; ni < nVertComp[nCompCount - 1] ; ++ ni) {
int nj = ( ni + 1 < nVertComp[nCompCount - 1]) ? ni + 1 : 0 ;
// Il triangolo è pronto
Triangle3d CurrentTriangle ;
Triangle3dEx CurrentTriangle ;
CurrentTriangle.Set( ptSol, CompoVert[nCompCount - 1][nj].ptInt, CompoVert[nCompCount - 1][ni].ptInt) ;
CurrentTriangle.SetAttrib( 1, CompoVert[nCompCount - 1][nj].nToolFlag) ;
CurrentTriangle.SetAttrib( 2, CompoVert[nCompCount - 1][ni].nToolFlag) ;
@@ -2339,7 +2350,7 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold
int nVoxIndexes[3] = { i, j, k} ;
bool bBoundary = IsAVoxelOnBoundary( nLimits, nVoxIndexes, true) ;
TRIA3DVECTOR vInnerTriaTemp, vBorderTriaTemp ;
TRIA3DEXVECTOR vInnerTriaTemp, vBorderTriaTemp ;
for ( int ni = 0 ; ni < nContSize ; ++ ni) {
@@ -2347,7 +2358,7 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold
if ( triContainer[ni].GetArea() > SQ_EPS_SMALL) {
int nVoxIJK[3] = { i, j, k} ;
Point3d ptTemp = ptSol ;
Triangle3d trTemp = triContainer[ni] ;
Triangle3dEx trTemp = triContainer[ni] ;
bool bTriangleOnBorder = IsATriangleOnBorder( trTemp, ptTemp, nLimits, nVoxIJK) ;
if ( ! bBoundary || ! bTriangleOnBorder)
vInnerTriaTemp.emplace_back( triContainer[ni]) ;
@@ -2441,7 +2452,7 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold
// Costruzione dei triangoli
for ( int TriIndex = 0; TriIndex < ( nVertComp[nCompCount - 1] - 2) * 3 ; TriIndex += 3) {
// Il triangolo è pronto
Triangle3d CurrentTriangle ;
Triangle3dEx CurrentTriangle ;
CurrentTriangle.Set( CompoTriVert[nCompCount - 1][TriIndex].ptInt,
CompoTriVert[nCompCount - 1][TriIndex+1].ptInt,
CompoTriVert[nCompCount - 1][TriIndex+2].ptInt) ;
@@ -2453,7 +2464,11 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold
CurrentTriangle.SetGrade( nTool0) ;
else if ( nTool1 == nTool2)
CurrentTriangle.SetGrade( nTool1) ;
//
// Setto le normali del campo vettoriali ai relativi vertici
CurrentTriangle.SetVertexNorm( 0, CompoTriVert[nCompCount - 1][TriIndex].vtNorm) ;
CurrentTriangle.SetVertexNorm( 1, CompoTriVert[nCompCount - 1][TriIndex+1].vtNorm) ;
CurrentTriangle.SetVertexNorm( 2, CompoTriVert[nCompCount - 1][TriIndex+2].vtNorm) ;
// Valido il triangolo
bool bV = CurrentTriangle.Validate( true) ;
// Riporto le coordinate nel sistema in cui è immerso lo Zmap
CurrentTriangle.ToGlob( m_MapFrame) ;
@@ -2468,7 +2483,7 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold
// Costruzione dei triangoli
for ( int TriIndex = 0; TriIndex < ( nVertComp[nCompCount - 1] - 2) * 3 ; TriIndex += 3) {
// Il triangolo è pronto
Triangle3d CurrentTriangle ;
Triangle3dEx CurrentTriangle ;
CurrentTriangle.Set( CompoTriVert[nCompCount - 1][TriIndex].ptInt,
CompoTriVert[nCompCount - 1][TriIndex+1].ptInt,
CompoTriVert[nCompCount - 1][TriIndex+2].ptInt) ;
@@ -2480,7 +2495,11 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, TriHolder& triHold
CurrentTriangle.SetGrade( nTool0) ;
else if ( nTool1 == nTool2)
CurrentTriangle.SetGrade( nTool1) ;
//
// Setto le normali del campo vettoriali ai relativi vertici
CurrentTriangle.SetVertexNorm( 0, CompoTriVert[nCompCount - 1][TriIndex].vtNorm) ;
CurrentTriangle.SetVertexNorm( 1, CompoTriVert[nCompCount - 1][TriIndex+1].vtNorm) ;
CurrentTriangle.SetVertexNorm( 2, CompoTriVert[nCompCount - 1][TriIndex+2].vtNorm) ;
// Valido il triangolo
bool bV = CurrentTriangle.Validate( true) ;
// Riporto le coordinate nel sistema in cui è immerso lo Zmap
CurrentTriangle.ToGlob( m_MapFrame) ;
@@ -2720,10 +2739,29 @@ VolZmap::FlipEdgesII( TriHolder& TriHold, bool bGraph) const
TriHold[n1].ptCompoVert[nCompo1]) ;
TriHold[n1].vCompoTria[nCompo1][nTri1].SetGrade( nCol1) ;
TriHold[n2].vCompoTria[nCompo2][nTri2].SetGrade( nCol2) ;
// Valido i triangoli
TriHold[n1].vCompoTria[nCompo1][nTri1].Validate( true) ;
TriHold[n2].vCompoTria[nCompo2][nTri2].Validate( true) ;
// Setto le normali a ogni vertice
Vector3d vtNorm1 = TriHold[n1].vCompoTria[nCompo1][nTri1].GetN() ;
Vector3d vtNorm2 = TriHold[n2].vCompoTria[nCompo2][nTri2].GetN() ;
int nFeatureIndex1 = 0 ;
int nFeatureIndex2 = 0 ;
for ( ; nFeatureIndex1 < 3 && nFeatureIndex2 < 3 ; ) {
if ( ! ( nFeatureIndex1 != SharedIndex[0] &&
nFeatureIndex1 != SharedIndex[2]))
++ nFeatureIndex1 ;
else if ( ! ( nFeatureIndex2 != SharedIndex[1] &&
nFeatureIndex2 != SharedIndex[3]))
++ nFeatureIndex2 ;
else
break ;
}
TriHold[n1].vCompoTria[nCompo1][nTri1].SetVertexNorm( SharedIndex[0], vtNorm1) ;
TriHold[n1].vCompoTria[nCompo1][nTri1].SetVertexNorm( nFeatureIndex1, vtNorm1) ;
TriHold[n2].vCompoTria[nCompo2][nTri2].SetVertexNorm( SharedIndex[3], vtNorm2) ;
TriHold[n2].vCompoTria[nCompo2][nTri2].SetVertexNorm( nFeatureIndex2, vtNorm2) ;
bModified = true ;
break ;
}
@@ -2851,8 +2889,8 @@ VolZmap::FlipEdgesBB( TriaMatrix& InterTria) const
// Se sono su un piano controllo se avviene inversione
bool bInv = false ;
if ( bOnPlane) {
Triangle3d trTF = InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB] ;
Triangle3d trTL = InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB] ;
Triangle3dEx trTF = InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB] ;
Triangle3dEx trTL = InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB] ;
int nVertF, nVertL ;
// Determino gli indici dei punti sharp-feature
for ( int nP = 0 ; nP < 3 ; ++ nP) {
@@ -2879,9 +2917,29 @@ VolZmap::FlipEdgesBB( TriaMatrix& InterTria) const
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].GetN() ;
Vector3d vtNormL = InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].GetN() ;
int nFeatureIndexF = 0 ;
int nFeatureIndexL = 0 ;
for ( ; nFeatureIndexF < 3 && nFeatureIndexL < 3 ; ) {
if ( ! ( nFeatureIndexF != SharedIndex[0] &&
nFeatureIndexF != SharedIndex[2]))
++ nFeatureIndexF ;
else if ( ! ( nFeatureIndexL != SharedIndex[1] &&
nFeatureIndexL != SharedIndex[3]))
++ nFeatureIndexL ;
else
break ;
}
InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].SetVertexNorm( SharedIndex[0], vtNormF) ;
InterTria[tFB][tVFB].vCompoTria[tCmpF][tTriFB].SetVertexNorm( nFeatureIndexF, vtNormF) ;
InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].SetVertexNorm( SharedIndex[3], vtNormL) ;
InterTria[tLB][tVLB].vCompoTria[tCmpL][tTriLB].SetVertexNorm( nFeatureIndexL, vtNormL) ;
bModified = true ;
break ;
@@ -3443,7 +3501,7 @@ VolZmap::IsAVoxelOnBoundary( const int nLimits[], const int nIJK[], bool bType)
//----------------------------------------------------------------------------
bool
VolZmap::IsATriangleOnBorder( const Triangle3d& trTria, const Point3d& ptVert,
VolZmap::IsATriangleOnBorder( const Triangle3dEx& trTria, const Point3d& ptVert,
const int nBlockLimits[], const int nVoxIJK[]) const
{
// Se il triangolo ha area nulla, esco
@@ -3585,7 +3643,7 @@ VolZmap::ProcessVoxContXY( VoxelContainer& VoxContXY, bool bPlus, TRIA3DEXLIST&
ptT2.ToGlob( m_MapFrame) ;
ptT3.ToGlob( m_MapFrame) ;
Triangle3d Tria0, Tria1 ;
Triangle3dEx Tria0, Tria1 ;
if ( bPlus) {
Tria0.Set( ptT0, ptT1, ptT3) ;
Tria1.Set( ptT1, ptT2, ptT3) ;
@@ -3707,7 +3765,7 @@ VolZmap::ProcessVoxContYZ( VoxelContainer& VoxContYZ, bool bPlus, TRIA3DEXLIST&
ptT2.ToGlob( m_MapFrame) ;
ptT3.ToGlob( m_MapFrame) ;
Triangle3d Tria0, Tria1 ;
Triangle3dEx Tria0, Tria1 ;
if ( bPlus) {
Tria0.Set( ptT0, ptT1, ptT3) ;
Tria1.Set( ptT1, ptT2, ptT3) ;
@@ -3829,7 +3887,7 @@ VolZmap::ProcessVoxContXZ( VoxelContainer& VoxContXZ, bool bPlus, TRIA3DEXLIST&
ptT2.ToGlob( m_MapFrame) ;
ptT3.ToGlob( m_MapFrame) ;
Triangle3d Tria0, Tria1 ;
Triangle3dEx Tria0, Tria1 ;
if ( bPlus) {
Tria0.Set( ptT0, ptT3, ptT1) ;
Tria1.Set( ptT1, ptT3, ptT2) ;