EgtGeomKernel :
- migliorie per visualizzazione smussata di Zmap.
This commit is contained in:
+78
-20
@@ -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) ;
|
||||
|
||||
Reference in New Issue
Block a user