diff --git a/VolZmapGraphics.cpp b/VolZmapGraphics.cpp index 81900c0..834d907 100644 --- a/VolZmapGraphics.cpp +++ b/VolZmapGraphics.cpp @@ -1178,7 +1178,7 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const } // Configurazione 3 - if (nAllConfig[nIndex] == 3) { + if ( nAllConfig[nIndex] == 3) { // Test sulla topologia bool bDefTopology = false ; bool bMatOnSlice = false ; @@ -1238,7 +1238,7 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const } } } - // La topologia è indefinita: calcolo la topologia + // La topologia è indefinita: la calcolo if ( ! bDefTopology && bReg) { Point3d ptFirstBar = ( CompoVert[0][0].ptPApp + CompoVert[0][1].ptPApp + CompoVert[0][2].ptPApp) / 3 ; @@ -1317,32 +1317,32 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const bool bNewTopology = Config3Duality( nIndex) ? bMatOnSlice : ! bMatOnSlice ; - // Si passa alla seconda topologia + // Si passa alla seconda topologia if ( bNewTopology) { - // Ricerca del caso corrispondente della nuova topologia + // Ricerca del caso corrispondente della nuova topologia int nt = 0 ; while ( nIndexVsIndex3[nt][0] != nIndex) ++ nt; int nRotCase = nIndexVsIndex3[nt][1] ; - // Aggiorno numero di componenti + // Aggiorno numero di componenti nComponents = Cases3Plus[nRotCase][1][0] ; - // Riaggiorno gli offsets + // Riaggiorno gli offsets nExtTabOff = nComponents ; nStdTabOff = 0 ; - // Modifico le matrici + // Modifico le matrici for ( int nC = 1 ; nC <= nComponents ; ++ nC) { - // Numero vertici per componenti + // Numero vertici per componenti nVertComp[nC - 1] = Cases3Plus[nRotCase][1][nC] ; - // Matrice dei vertici della base del fan + // Matrice dei vertici della base del fan for ( int nFanVert = 0 ; nFanVert < nVertComp[nC - 1] ; ++ nFanVert) CompoVert[nC - 1][nFanVert] = VecField[Cases3Plus[nRotCase][1][nFanVert + nExtTabOff + 1]] ; - // Matrici dei vertici dei triangoli in assenza di sharp feature + // 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[Cases3Plus[nRotCase][0][nStdTabOff + nTriVert + 2]] ; CompoTriVert[nC - 1][nTriVert + 1] = VecField[Cases3Plus[nRotCase][0][nStdTabOff + nTriVert + 1]] ; CompoTriVert[nC - 1][nTriVert + 2] = VecField[Cases3Plus[nRotCase][0][nStdTabOff + nTriVert]] ; } - // Aggiorno gli offsets per raggiungere i vertici della componente successiva. + // Aggiorno gli offsets per raggiungere i vertici della componente successiva. nExtTabOff += nVertComp[nC - 1] ; nStdTabOff += 3 * ( nVertComp[nC - 1] - 2) ; } @@ -1357,8 +1357,7 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const int nCount = 0 ; while ( nIndexConfig6[nCount] != nIndex) ++ nCount ; - // Vedo se la topologia è definita: se sì uso l'informazione già posseduta, - // altrimenti devo calcolare la topologia + // Vedo se la topologia è definita: altrimenti la ricalcolo int nIJKSl[3] = { ( nAdjVox6[nCount] != 1 ? i : i + 1), ( nAdjVox6[nCount] != 2 ? j : j + 1), ( nAdjVox6[nCount] != 3 ? k : k + 1)} ; @@ -1413,7 +1412,7 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const // Topologia indefinita: la calcolo if ( ! bDefTopology && bReg) { Point3d ptFirstBar = ( CompoVert[0][0].ptPApp + CompoVert[0][1].ptPApp + - CompoVert[0][2].ptPApp + CompoVert[0][3].ptPApp) / 3 ; + CompoVert[0][2].ptPApp + CompoVert[0][3].ptPApp) / 4 ; Point3d ptSecondBar = ( CompoVert[1][0].ptPApp + CompoVert[1][1].ptPApp + CompoVert[1][2].ptPApp) / 3 ; Vector3d vtDiagBar = ptSecondBar - ptFirstBar ; @@ -1493,38 +1492,38 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const } } bool bNewTopology = ( Config6Duality( nIndex) ? bMatOnSlice : ! bMatOnSlice) ; - // Si deve passare alla seconda topologia + // Si deve passare alla seconda topologia if ( bNewTopology) { - // Ricerca del caso corrispondente della nuova topologia + // Ricerca del caso corrispondente della nuova topologia int nt = 0 ; while ( nIndexVsIndex6[nt][0] != nIndex) ++ nt ; int nRotCase = nIndexVsIndex6[nt][1] ; - - // Aggiorno numero di componenti + // Aggiorno numero di componenti nComponents = Cases6Plus[nRotCase][1][0] ; - // Riaggiorno gli offsets + // Riaggiorno gli offsets nExtTabOff = nComponents ; nStdTabOff = 0 ; - // Modifico le matrici + // Modifico le matrici for ( int nC = 1 ; nC <= nComponents ; ++ nC) { - // Numero vertici per componenti + // Numero vertici per componenti nVertComp[nC - 1] = Cases6Plus[nRotCase][1][nC] ; - // Matrice dei vertici della base del fan + // 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 + // 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]] ; } - // Aggiorno gli offsets per raggiungere i vertici della componente successiva. + // Aggiorno gli offsets per raggiungere i vertici della componente successiva. nExtTabOff += nVertComp[nC - 1] ; nStdTabOff += 3 * ( nVertComp[nC - 1] - 2) ; } } } + // Configurazione 7 else if ( nAllConfig[nIndex] == 7) { // !!! Versione provvisoria, deve essere riveduta e semplificata !!! @@ -1538,7 +1537,7 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const int nCount = 0 ; while ( nIndexConfig7[nCount] != nIndex) ++ nCount ; - + // Vedo se la topologia è definita: se sì uso l'informazione già posseduta, // altrimenti devo calcolare la topologia @@ -1560,12 +1559,12 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const if ( nAdjVox7[nCount][1] == 2) { ++ nIJKSlXZ[1] ; nCurFaceXZ = 3 ; - } + } int nIJKSlXY[3] = { i, j, k} ; if ( nAdjVox7[nCount][2] == 3) { ++ nIJKSlXY[2] ; nCurFaceXY = 5 ; - } + } // Assegno l'indice zero alle facce in gioco. L'indice zero è per le facce in gioco // su cui non si è certi se ci sia o meno materiale. nFace[nCurFaceYZ] = 0 ; @@ -1576,14 +1575,14 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const int nSlYZN ; int nSlYZBlockN ; if ( GetVoxNFromIJK( nIJKSlYZ[0], nIJKSlYZ[1], nIJKSlYZ[2], nSlYZN)) { - // Slice interna al blocco + // Slice interna al blocco auto it = SliceYZ.find( nSlYZN) ; // Topologia definita if ( it != SliceYZ.end()) { bMatOnSliceYZ = it->second ; bDefSliceYZ = true ; nFace[nCurFaceYZ] = 1 ; - } + } // Slice sulla frontiera int nSlBlockIJK[3] ; GetVoxelBlockIJK( nIJKSlYZ, nSlBlockIJK) ; @@ -1594,23 +1593,23 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const bMatOnSliceYZ = it->second ; bDefSliceYZ = true ; nFace[nCurFaceYZ] = 1 ; - } - } + } + } } int nSlXZN ; int nSlXZBlockN ; if ( GetVoxNFromIJK( nIJKSlXZ[0], nIJKSlXZ[1], nIJKSlXZ[2], nSlXZN)) { - // Slice interna al blocco + // Slice interna al blocco auto it = SliceXZ.find( nSlXZN) ; // Topologia definita if ( it != SliceXZ.end()) { bMatOnSliceXZ = it->second ; bDefSliceXZ = true ; nFace[nCurFaceXZ] = 1 ; - } + } // Slice sulla frontiera int nSlBlockIJK[3] ; - GetVoxelBlockIJK( nIJKSlXZ, nSlBlockIJK) ; + GetVoxelBlockIJK( nIJKSlXZ, nSlBlockIJK) ; if ( GetBlockNFromIJK( nSlBlockIJK, nSlXZBlockN)) { auto it = m_SliceYZ[nSlXZBlockN].find( nSlXZN) ; // Topologia definita @@ -1618,23 +1617,23 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const bMatOnSliceXZ = it->second ; bDefSliceXZ = true ; nFace[nCurFaceXZ] = 1 ; - } - } + } + } } int nSlXYN ; int nSlXYBlockN ; if ( GetVoxNFromIJK( nIJKSlXY[0], nIJKSlXY[1], nIJKSlXY[2], nSlXYN)) { - // Slice interna al blocco + // Slice interna al blocco auto it = SliceXY.find( nSlXYN) ; // Topologia definita if ( it != SliceXY.end()) { bMatOnSliceXY = it->second ; bDefSliceXY = true ; nFace[nCurFaceXY] = 1 ; - } + } // Slice sulla frontiera int nSlBlockIJK[3] ; - GetVoxelBlockIJK( nIJKSlXY, nSlBlockIJK) ; + GetVoxelBlockIJK( nIJKSlXY, nSlBlockIJK) ; if ( GetBlockNFromIJK( nSlBlockIJK, nSlXYBlockN)) { auto it = m_SliceYZ[nSlXYBlockN].find( nSlXYN) ; // Topologia definita @@ -1642,8 +1641,8 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const bMatOnSliceXY = it->second ; bDefSliceXY = true ; nFace[nCurFaceXY] = 1 ; - } - } + } + } } // Numerazione delle facce del voxel 0: YZ- 1: XZ- 2: YZ+ 3: XZ+ 4: XY- 5: XY+ @@ -1669,14 +1668,14 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const for ( int nFaceEdge = 0 ; nFaceEdge < 4 ; ++ nFaceEdge) { // Edge della componente coincide con quello della faccia if ( nSliceEdges[nFaceN][nFaceEdge] == TriangleTableEn[nIndex][1][3 + nCurComp - 1 + nEdge]) { - ++ nMatchEdge ; + ++ nMatchEdge ; break ; - } - } + } + } // La componente corrente ha due edge sulla faccia, - // interrompiamo la ricerca di edge corrispondenti + // interrompiamo la ricerca di edge corrispondenti if ( nMatchEdge == 2) - break ; + break ; } // Abbiamo trovato una nuova componente con due edge sulla faccia if ( nMatchEdge == 2) { @@ -1689,20 +1688,20 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const if ( nFaceCompo2 != 0) break ; } - // Valuto la topologia VecField[EdgeIndex] edgeIndex = 0, 1, ..., 11 - double dDotSum = 0 ; + // Valuto la topologia VecField[EdgeIndex] edgeIndex = 0, 1, ..., 11 + double dDotSum = 0 ; for ( int nV = 0 ; nV < 3 ; ++ nV) { Vector3d vtV1 = VecField[TriangleTableEn[nIndex][1][3 + nFaceCompo1 - 1 + nV]].vtVec ; Vector3d vtV2 = VecField[TriangleTableEn[nIndex][1][3 + nFaceCompo2 - 1 + nV]].vtVec ; dDotSum += ( vtV1 * vtV2) ; } if ( nFace[nFaceN] == 0 || nFace[nFaceN] == 2) - bMatOnSliceXZ = dDotSum > 0. ; + bMatOnSliceXZ = dDotSum > 0. ; else if ( nFace[nFaceN] == 1 || nFace[nFaceN] == 3) - bMatOnSliceYZ = dDotSum > 0. ; + bMatOnSliceYZ = dDotSum > 0. ; else - bMatOnSliceXY = dDotSum > 0. ; - } + bMatOnSliceXY = dDotSum > 0. ; + } } } // Uso le informazioni per scegliere la topologia @@ -1744,23 +1743,24 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const // Conservo l'informazione if ( GetVoxNFromIJK( nIJKSlYZ[0], nIJKSlYZ[1], nIJKSlYZ[2], nSlYZN)) { if ( nSlYZBlockN == nBlock) - SliceYZ.emplace( nSlYZN, bMatOnSliceYZ) ; + SliceYZ.emplace( nSlYZN, bMatOnSliceYZ) ; else m_SliceYZ[nSlYZBlockN].emplace( nSlYZN, bMatOnSliceYZ) ; } if ( GetVoxNFromIJK( nIJKSlXZ[0], nIJKSlXZ[1], nIJKSlXZ[2], nSlXZN)) { if ( nSlXZBlockN == nBlock) - SliceXZ.emplace( nSlXZN, bMatOnSliceXZ) ; + SliceXZ.emplace( nSlXZN, bMatOnSliceXZ) ; else m_SliceXZ[nSlXZBlockN].emplace( nSlXZN, bMatOnSliceXZ) ; } if ( GetVoxNFromIJK( nIJKSlXY[0], nIJKSlXY[1], nIJKSlXY[2], nSlXYN)) { if ( nSlXYBlockN == nBlock) - SliceXY.emplace( nSlXYN, bMatOnSliceXY) ; + SliceXY.emplace( nSlXYN, bMatOnSliceXY) ; else m_SliceXY[nSlXYBlockN].emplace( nSlXYN, bMatOnSliceXY) ; - } + } } + // Configurazione 10 else if ( nAllConfig[nIndex] == 10) { // Test sulla topologia @@ -2007,43 +2007,6 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const } if ( ! bVertMoved && nAllConfig[nIndex] == 8) { bool bSpecialCase = false ; - /* int nV0, nV1, nV2, nV3 ; - if ( CompoVert[nComp][0].vtVec * CompoVert[nComp][1].vtVec > 0.7 && - CompoVert[nComp][2].vtVec * CompoVert[nComp][3].vtVec > 0.7) { - nV0 = 0 ; - nV1 = 1 ; - nV2 = 2 ; - nV3 = 3 ; - bSpecialCase = true ; - } - if ( CompoVert[nComp][0].vtVec * CompoVert[nComp][2].vtVec > 0.7 && - CompoVert[nComp][1].vtVec * CompoVert[nComp][3].vtVec > 0.7) { - nV0 = 0 ; - nV1 = 2 ; - nV2 = 1 ; - nV3 = 3 ; - bSpecialCase = true ; - }*/ - /*int nCouple[4] = { -1, -1, -1, -1} ; - int nFirstFree = 0 ; - for ( int a = 0 ; a < 3 ; ++ a) { - for ( int b = a + 1 ; b < 4 ; ++ b) { - if ( CompoVert[nComp][a].vtVec * CompoVert[nComp][b].vtVec > 0.9) { - bool bNewCoupleValid = true ; - for ( int d = 0 ; d < nFirstFree ; ++ d) { - if ( nCouple[d] == a || nCouple[d] == b) { - bNewCoupleValid = false ; - break ; - } - } - if ( bNewCoupleValid) { - nCouple[nFirstFree] = a ; - nCouple[nFirstFree + 1] = b ; - nFirstFree += 2 ; - } - } - } - }*/ int nCouple[4] = { -1, -1, -1, -1} ; int nFirstFree = 0 ; for ( int a = 0 ; a < 4 ; ++ a) {