EgtGeomKernel :

- correzione a Zmap di errore in ultimo commit.
This commit is contained in:
Dario Sassi
2019-02-21 07:48:02 +00:00
parent 54f92e0ecc
commit ebf50b6443
+56 -93
View File
@@ -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) {