diff --git a/VolZmap.h b/VolZmap.h index 31bdd14..9828eae 100644 --- a/VolZmap.h +++ b/VolZmap.h @@ -31,7 +31,7 @@ struct TriaStruct { int i, j, k ; std::vector ptCompoVert ; - std::vector vCompoTria ; + std::vector vCompoTria ; } ; // Vettore di TriaStruct con sharp fature interni a un blocco @@ -296,7 +296,7 @@ class VolZmap : public IVolZmap, public IGeoObjRW bool GetVoxelBlockIJK( const int nVoxIJK[], int nBlockIJK[]) const ; bool GetAdjBlockToBlock( int nBlockN, int nDeltaI, int nDeltaJ, int nDeltaK, int& nAdjBlockN) const ; bool IsAVoxelOnBoundary( const int nLimits[], const int nIJK[], bool bType) const ; - bool IsATriangleOnBorder( const Triangle3d& trTria, const Point3d& ptVert, + bool IsATriangleOnBorder( const Triangle3dEx& trTria, const Point3d& ptVert, const int nBlockLimits[], const int nVoxIJK[]) const ; // Funzioni per facce canoniche con grandi triangoli bool ProcessVoxContXY( VoxelContainer& VoxContXY, bool bPlus, TRIA3DEXLIST& lstTria) const ; diff --git a/VolZmapGraphics.cpp b/VolZmapGraphics.cpp index 4c1e341..7922958 100644 --- a/VolZmapGraphics.cpp +++ b/VolZmapGraphics.cpp @@ -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) ;