EgtGeomKernel :

- correzione a visualizzazione di Zmap (scelta topologia per caso 3 di MC).
This commit is contained in:
Dario Sassi
2018-04-09 18:58:38 +00:00
parent f4c0c2ee0f
commit fb66eab227
+23 -16
View File
@@ -64,8 +64,9 @@ TestOnNormal( const AppliedVector CompoField[], int nCompoElem)
}
// Se la massima deviazione non supera il limite non è feature
const double SHARP_COS = 0.866 ;
if ( dMinCosTheta >= SHARP_COS)
const double SHARP_COS_SUP = 0.866 ;
const double SHARP_COS_INF = - 0.985 ; // - 0.6
if ( dMinCosTheta >= SHARP_COS_SUP || dMinCosTheta <= SHARP_COS_INF)
return NO_FEATURE ;
// Verifico se Edge o Corner
@@ -1405,9 +1406,6 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV
for ( int j = nLimits[2] ; j < nLimits[3] ; ++ j) {
for ( int k = nLimits[4] ; k < nLimits[5] ; ++ k) {
/* if ( ! ( j >= 2 && j <= 8) )
continue ;*/
// Classificazione dei vertici: interni o esterni al materiale
int nIndex = CalcIndex( i, j, k) ;
@@ -1554,18 +1552,27 @@ VolZmap::ExtMarchingCubes( int nBlock, TRIA3DEXLIST& lstTria, VoxelContainer& vV
if ( bReg) {
// Configurazione 3
if ( nAllConfig[nIndex] == 3) {
// Verifico concordanza tra i versori di una stessa componente
// (ogni coppia di vettori di una medesima componente deve avere prodotto scalare non inferiore a 0.7)
Vector3d vtCmpAvg0, vtCmpAvg1 ;
bool bTest0 = DotTest( CompoVert[0], 3, vtCmpAvg0, 0.7) ;
bool bTest1 = DotTest( CompoVert[1], 3, vtCmpAvg1, 0.7) ;
// Se i versori di entrambe le componenti sono concordi ha senso parlare di vettori medi.
// Altrimenti assegno al loro prodotto scalare un valore assurdo come -2
double dScProd = - 2 ;
if ( bTest0 && bTest1)
dScProd = vtCmpAvg0 * vtCmpAvg1 ;
// Test sulla topologia
double dDotSum = 0 ;
for ( int nFV = 0 ; nFV < 3 ; ++ nFV) {
for ( int nTV = 0 ; nTV < 2 ; ++ nTV) {
dDotSum += CompoVert[0][nFV].vtVec * CompoVert[1][nTV].vtVec ;
}
}
for ( int nFVI = 0 ; nFVI < 2 ; ++ nFVI) {
for ( int nFVJ = nFVI + 1 ; nFVJ < 3 ; ++ nFVJ) {
dDotSum -= CompoVert[0][nFVI].vtVec * CompoVert[0][nFVJ].vtVec ;
}
}
for ( int nTVI = 0 ; nTVI < 2 ; ++ nTVI) {
for ( int nTVJ = nTVI + 1 ; nTVJ < 3 ; ++ nTVJ) {
dDotSum -= CompoVert[1][nTVI].vtVec * CompoVert[1][nTVJ].vtVec ;
}
}
bool bTestOnSum = dDotSum > 0 ;
// Si passa alla seconda topologia
if ( ! ( bTest0 && bTest1) || ( bTest0 && bTest1 && dScProd > 0.7)) {
if ( bTestOnSum) {
// Ricerca del caso corrispondente della nuova topologia
int nt = 0 ;
while ( nIndexVsIndex3[nt][0] != nIndex)