EgtGeomKernel :
- correzione a Zmap di errore in ultimo commit.
This commit is contained in:
+56
-93
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user