Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel
This commit is contained in:
Binary file not shown.
@@ -116,7 +116,7 @@ IntersSurfTmSurfTm( const ISurfTriMesh& Stm1, const ISurfTriMesh& Stm2,
|
||||
}
|
||||
}
|
||||
// se altrimenti sovrapposizione
|
||||
else if ( nRes == ITTT_OVERLAPS) {
|
||||
else if ( nRes == ITTT_OVERLAPS || nRes == ITTT_COUNTER_OVERLAPS) {
|
||||
for ( const auto& Tria : vIttTria) {
|
||||
// verifico se triangolo già inserito
|
||||
bool bFound = false ;
|
||||
|
||||
+5
-3
@@ -84,6 +84,7 @@ IntersTriaTria( const Triangle3d& trTria1, const Triangle3d& trTria2, Point3d& p
|
||||
if ( nResPP == IPPT_OVERLAPS ||
|
||||
((( nVertPos1 == 0 && nVertNeg1 == 0) || ( nVertPos2 == 0 && nVertNeg2 == 0)) &&
|
||||
( trTria1.GetN() ^ trTria2.GetN()).SqLen() < 25 * SIN_EPS_ANG_SMALL * SIN_EPS_ANG_SMALL)) {
|
||||
// verifica per triangoli con normali controverse
|
||||
bool bCounter = false ;
|
||||
Triangle3d trMyTria2 = trTria2 ;
|
||||
if ( trTria1.GetN() * trTria2.GetN() < 0) {
|
||||
@@ -93,6 +94,7 @@ IntersTriaTria( const Triangle3d& trTria1, const Triangle3d& trTria2, Point3d& p
|
||||
trMyTria2.Validate() ;
|
||||
bCounter = true ;
|
||||
}
|
||||
// verifica per triangoli coincidenti
|
||||
bool bAreSameTria = ( ( AreSamePointExact( trTria1.GetP( 0), trMyTria2.GetP( 0)) &&
|
||||
AreSamePointExact( trTria1.GetP( 1), trMyTria2.GetP( 1)) &&
|
||||
AreSamePointExact( trTria1.GetP( 2), trMyTria2.GetP( 2))) ||
|
||||
@@ -139,7 +141,7 @@ IntersTriaTria( const Triangle3d& trTria1, const Triangle3d& trTria2, Point3d& p
|
||||
int
|
||||
IntersCoplanarTriaTria( const Triangle3d& trTria1, const Triangle3d& trTria2, TRIA3DVECTOR& vTria)
|
||||
{
|
||||
// Se i tre vertici del secondo triangolo stanno tutti a destra di almeno un lato del primo, non c'è intersezione
|
||||
// Se i tre vertici del secondo triangolo stanno tutti a destra di almeno un lato del primo, non c'� intersezione
|
||||
for ( int i = 0 ; i < 3 ; ++ i) {
|
||||
Vector3d vtSide = trTria1.GetP( ( i + 1) % 3) - trTria1.GetP( i) ;
|
||||
Vector3d vtSN = vtSide ^ trTria1.GetN() ;
|
||||
@@ -149,7 +151,7 @@ IntersCoplanarTriaTria( const Triangle3d& trTria1, const Triangle3d& trTria2, TR
|
||||
( trTria2.GetP( 2) - trTria1.GetP( i)) * vtSN > - EPS_TRIA_H)
|
||||
return ITTT_NO ;
|
||||
}
|
||||
// Se i tre vertici del primo triangolo stanno tutti a destra di almeno un lato del secondo, non c'è intersezione
|
||||
// Se i tre vertici del primo triangolo stanno tutti a destra di almeno un lato del secondo, non c'� intersezione
|
||||
for ( int i = 0 ; i < 3 ; ++ i) {
|
||||
Vector3d vtSide = trTria2.GetP( ( i + 1) % 3) - trTria2.GetP( i) ;
|
||||
Vector3d vtSN = vtSide ^ trTria2.GetN() ;
|
||||
@@ -232,7 +234,7 @@ int
|
||||
FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& trTria2, const Point3d& ptLineSt, const Vector3d& vtLineDir,
|
||||
double dStU1, double dEnU1, double dStU2, double dEnU2, int nRes1, int nRes2, double& dIntStU, double& dIntEnU)
|
||||
{
|
||||
// Controllo su validità input
|
||||
// Controllo su validit� input
|
||||
if ( ! ( trTria1.IsValid() && trTria2.IsValid() && vtLineDir.IsNormalized()))
|
||||
return ITTT_NO ;
|
||||
// Casi
|
||||
|
||||
+1
-1
@@ -239,7 +239,7 @@ SurfTriMesh::RemoveTriangle( int nId)
|
||||
// indice vertice
|
||||
int nV = m_vTria[nId].nIdVert[i] ;
|
||||
// se vertice non c'è passo al prossimo
|
||||
if ( nV < 0 || nV >= int( m_vTria.size()))
|
||||
if ( nV < 0 || nV >= int( m_vVert.size()))
|
||||
continue ;
|
||||
if ( m_vVert[nV].nIdTria == nId) {
|
||||
int nAdjP = m_vTria[nId].nIdAdjac[i] ;
|
||||
|
||||
+56
-53
@@ -181,7 +181,7 @@ SurfTriMesh::DecomposeLoop( CHAINVECTOR& cvOpenChain, INTVECTOR& vnDegVec, PNTMA
|
||||
// elimino i punti superflui prima
|
||||
for ( int i = 0 ; i < nCvFirst ; ++ i)
|
||||
cvBoundClosedLoopVec[nLoop].erase( cvBoundClosedLoopVec[nLoop].begin()) ;
|
||||
// verifico se questo punto è dalla parte valida o no
|
||||
// verifico se questo punto � dalla parte valida o no
|
||||
bool bC12 = ( ( ptM12 - ptProva) * vtVecProva < 0) ;
|
||||
vbInOut[nLoop] = bC12 ;
|
||||
}
|
||||
@@ -192,7 +192,7 @@ SurfTriMesh::DecomposeLoop( CHAINVECTOR& cvOpenChain, INTVECTOR& vnDegVec, PNTMA
|
||||
// elimino i punti superflui intermedi
|
||||
for ( int i = nCvFirst + 2 ; i < nCvSecond ; ++ i)
|
||||
cvBoundClosedLoopVec[nLoop].erase( cvBoundClosedLoopVec[nLoop].begin() + nCvFirst + 2) ;
|
||||
// verifico se questo punto è dalla parte valida o no
|
||||
// verifico se questo punto � dalla parte valida o no
|
||||
bool bC21 = ( ( ptM21 - ptProva) * vtVecProva < 0) ;
|
||||
vbInOut[nLoop] = bC21 ;
|
||||
}
|
||||
@@ -251,7 +251,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT
|
||||
|
||||
if ( int( it->second.size()) == 0)
|
||||
continue ;
|
||||
// Se il triangolo è stato sottoposto a ritriangolazione, le sue componenti sono classificabili come dentro-fuori.
|
||||
// Se il triangolo � stato sottoposto a ritriangolazione, le sue componenti sono classificabili come dentro-fuori.
|
||||
// Lo tolgo dall'insieme dei triangoli ambigui (intersezione edge-edge)
|
||||
else {
|
||||
auto itS = Ambiguos.find( it->first) ;
|
||||
@@ -499,7 +499,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT
|
||||
// Creo il loop chiuso padre di tutti, il perimetro del triangolo.
|
||||
// Questo viene diviso in sotto-loop chiusi mediante quelli aperti.
|
||||
// I loop chiusi trovati precedentemente sono interni a uno dei sotto-loop
|
||||
// chiusi di cui è formato il perimetro.
|
||||
// chiusi di cui � formato il perimetro.
|
||||
PNTVECTOR cvFirstLoop ;
|
||||
cvFirstLoop.emplace_back( trTria.GetP( 0)) ;
|
||||
cvFirstLoop.emplace_back( trTria.GetP( 1)) ;
|
||||
@@ -579,7 +579,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT
|
||||
// Assegno ai loop trovati i rispettivi interni
|
||||
// Assumo che i loop interni a uno dei loop creati fino ad'ora siano tutti sullo stesso livello.
|
||||
// Il caso generale si risolve con una struttura ad albero in cui il nodi corrispondente a un
|
||||
// loop è figlio del nodo corrispondente al loop che lo contiene.
|
||||
// loop � figlio del nodo corrispondente al loop che lo contiene.
|
||||
INTVECTOR vInnerLoop ;
|
||||
for ( int nCLI = 0 ; nCLI < int( cvClosedChain.size()) ; ++ nCLI) {
|
||||
for ( int nPtNum = 0 ; nPtNum < int( cvClosedChain[nCLI].size()) ; ++ nPtNum) {
|
||||
@@ -1004,7 +1004,7 @@ SurfTriMesh::AmbiguosTriangleManager( TRIA3DVECTORMAP& Ambiguos, SurfTriMesh& Su
|
||||
{
|
||||
for ( auto it = Ambiguos.begin() ; it != Ambiguos.end() ; ++ it) {
|
||||
// Se il triangolo ha l'indice diverso da zero vuol dire che oltre a un
|
||||
// contatto edge-edge ha avuto dei contatti che lo hanno già classificato.
|
||||
// contatto edge-edge ha avuto dei contatti che lo hanno gi� classificato.
|
||||
if ( Surf.m_vTria[it->first].nTempPart != 0)
|
||||
continue ;
|
||||
// Recupero il triangolo corrente
|
||||
@@ -1080,7 +1080,7 @@ SurfTriMesh::AmbiguosTriangleManager( TRIA3DVECTORMAP& Ambiguos, SurfTriMesh& Su
|
||||
if ( j < 3)
|
||||
break ;
|
||||
}
|
||||
// Se la classificazione è coerente segno gli edge di contatto come invalicabili
|
||||
// Se la classificazione � coerente segno gli edge di contatto come invalicabili
|
||||
Surf.m_vTria[it->first].nETempFlag[0] = int( vAdjSegToCurTria[0].size()) > 0 ? 1 : 0 ;
|
||||
Surf.m_vTria[it->first].nETempFlag[1] = int( vAdjSegToCurTria[1].size()) > 0 ? 1 : 0 ;
|
||||
Surf.m_vTria[it->first].nETempFlag[2] = int( vAdjSegToCurTria[2].size()) > 0 ? 1 : 0 ;
|
||||
@@ -1106,7 +1106,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
// Ciclo sui triangoli delle mesh
|
||||
int nTriaNumA = GetTriangleSize() ;
|
||||
int nTriaNumB = SurfB.GetTriangleSize() ;
|
||||
// Setto il triangolo come né fuori né dentro
|
||||
// Setto il triangolo come n� fuori n� dentro
|
||||
for ( int nTA = 0 ; nTA < nTriaNumA ; ++ nTA) {
|
||||
m_vTria[nTA].nTempPart = 0 ;
|
||||
m_vTria[nTA].nETempFlag[0] = 0 ;
|
||||
@@ -1122,7 +1122,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
// Resetto e ricalcolo la HashGrid della superficie B
|
||||
SurfB.ResetHashGrids3d() ;
|
||||
for ( int nTA = 0 ; nTA < nTriaNumA ; ++ nTA) {
|
||||
// Se il triangolo A non è valido, continuo
|
||||
// Se il triangolo A non � valido, continuo
|
||||
Triangle3d trTriaA ;
|
||||
if ( ! GetTriangle( nTA, trTriaA) || ! trTriaA.Validate( true))
|
||||
continue ;
|
||||
@@ -1133,7 +1133,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
INTVECTOR vNearTria ;
|
||||
SurfB.GetAllTriaOverlapBox( b3dTriaA, vNearTria) ;
|
||||
for ( int nTB = 0 ; nTB < int( vNearTria.size()) ; ++ nTB) {
|
||||
// Se il triangolo B non è valido, continuo
|
||||
// Se il triangolo B non � valido, continuo
|
||||
Triangle3d trTriaB ;
|
||||
if ( ! SurfB.GetTriangle( vNearTria[nTB], trTriaB) || ! trTriaB.Validate( true))
|
||||
continue ;
|
||||
@@ -1209,7 +1209,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
}
|
||||
}
|
||||
if ( nSegMaxDist >= 0) {
|
||||
// Cerco qual'è il segmento di contatto per dichiararlo come invalicabile
|
||||
// Cerco qual'� il segmento di contatto per dichiararlo come invalicabile
|
||||
int nVA ;
|
||||
for ( nVA = 0 ; nVA < 3 ; ++ nVA) {
|
||||
if ( abs( ( trTriaA.GetP( nVA) - trTriaB.GetP( 0)) * trTriaB.GetN()) < EPS_SMALL &&
|
||||
@@ -1233,7 +1233,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
}
|
||||
}
|
||||
if ( nSegMaxDist >= 0) {
|
||||
// Cerco qual'è il segmento di contatto per dichiararlo come invalicabile
|
||||
// Cerco qual'� il segmento di contatto per dichiararlo come invalicabile
|
||||
int nVB ;
|
||||
for ( nVB = 0 ; nVB < 3 ; ++ nVB) {
|
||||
if ( abs( ( trTriaB.GetP( nVB) - trTriaA.GetP(0)) * trTriaA.GetN()) < EPS_SMALL &&
|
||||
@@ -1246,8 +1246,8 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
}
|
||||
}
|
||||
// Intersezione edge-edge: salvo indice e vettore triangoli
|
||||
// Uso i triangoli perché, se un triangolo fosse cancellato, non potrei accedervi poi usando l'indice.
|
||||
// Salvando i triangoli risolvo il problema perché ai fini dello studio di questi contatti, triangolo
|
||||
// Uso i triangoli perch�, se un triangolo fosse cancellato, non potrei accedervi poi usando l'indice.
|
||||
// Salvando i triangoli risolvo il problema perch� ai fini dello studio di questi contatti, triangolo
|
||||
// e sua ritriangolazione portano al medesimo risultato.
|
||||
else if ( bIntOnEndgeA && bIntOnEndgeB) {
|
||||
auto itA = AmbiguosA.find( nTA) ;
|
||||
@@ -1277,7 +1277,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
RetriangulationForBooleanOperation( LineMapA, AmbiguosA, *this, bModif) ;
|
||||
RetriangulationForBooleanOperation( LineMapB, AmbiguosB, SurfB, bModif) ;
|
||||
|
||||
// Se i triangoli delle superfici non si intersecano, una delle due è totalmente interna o esterna all'altra.
|
||||
// Se i triangoli delle superfici non si intersecano, una delle due � totalmente interna o esterna all'altra.
|
||||
bool bRetriangulated = true ;
|
||||
if ( ! bModif && ( int( AmbiguosA.size()) == 0 || int( AmbiguosB.size()) == 0)) {
|
||||
bRetriangulated = false ;
|
||||
@@ -1289,7 +1289,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
int nTriaNum = - 1 ;
|
||||
double dMinDist = DBL_MAX ;
|
||||
for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) {
|
||||
// Se il triangolo B non è valido, continuo
|
||||
// Se il triangolo B non � valido, continuo
|
||||
Triangle3d trTriaB ;
|
||||
if ( ! SurfB.GetTriangle( nTB, trTriaB) || ! trTriaB.Validate( true))
|
||||
continue ;
|
||||
@@ -1322,7 +1322,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
int nTriaNum = - 1 ;
|
||||
double dMinDist = DBL_MAX ;
|
||||
for ( int nTA = 0 ; nTA < nTriaNumA ; ++ nTA) {
|
||||
// Se il triangolo A non è valido, continuo
|
||||
// Se il triangolo A non � valido, continuo
|
||||
Triangle3d trTriaA ;
|
||||
if ( ! ( GetTriangle( nTA, trTriaA) && trTriaA.Validate( true)))
|
||||
continue ;
|
||||
@@ -1354,7 +1354,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
}
|
||||
}
|
||||
|
||||
// Se c'è stata una ritriangolazione di almeno un triangolo, NON siamo nel caso di tutto dentro o tutto fuori.
|
||||
// Se c'� stata una ritriangolazione di almeno un triangolo, NON siamo nel caso di tutto dentro o tutto fuori.
|
||||
// Studio i triangoli ambigui.
|
||||
if ( bRetriangulated) {
|
||||
AmbiguosTriangleManager( AmbiguosA, *this) ;
|
||||
@@ -1371,7 +1371,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
// Resetto e ricalcolo la HashGrid della superficie B
|
||||
SurfB.ResetHashGrids3d() ;
|
||||
for ( int nTA = 0 ; nTA < nTriaNum2A ; ++ nTA) {
|
||||
// Se il triangolo A non è valido, continuo
|
||||
// Se il triangolo A non � valido, continuo
|
||||
Triangle3d trTriaA ;
|
||||
if ( ! GetTriangle( nTA, trTriaA) || ! trTriaA.Validate( true))
|
||||
continue ;
|
||||
@@ -1382,7 +1382,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
INTVECTOR vNearTria ;
|
||||
SurfB.GetAllTriaOverlapBox( b3dTriaA, vNearTria) ;
|
||||
for ( int nTB = 0 ; nTB < int( vNearTria.size()) ; ++ nTB) {
|
||||
// Se il triangolo B non è valido, continuo
|
||||
// Se il triangolo B non � valido, continuo
|
||||
Triangle3d trTriaB ;
|
||||
if ( ! SurfB.GetTriangle( vNearTria[nTB], trTriaB) || ! trTriaB.Validate( true))
|
||||
continue ;
|
||||
@@ -1395,8 +1395,8 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
SurfB.m_vTria[vNearTria[nTB]].nTempPart = 2 ;
|
||||
}
|
||||
else if ( nIntTypeAB == ITTT_COUNTER_OVERLAPS) {
|
||||
m_vTria[nTA].nTempPart = - 2 ;
|
||||
SurfB.m_vTria[vNearTria[nTB]].nTempPart = - 2 ;
|
||||
m_vTria[nTA].nTempPart = -2 ;
|
||||
SurfB.m_vTria[vNearTria[nTB]].nTempPart = -2 ;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1411,7 +1411,7 @@ bool
|
||||
SurfTriMesh::IdentifyParts( void) const
|
||||
{
|
||||
for ( int i = 0 ; i < int( m_vTria.size()) ; ++ i) {
|
||||
// salto triangoli cancellati o già assegnati
|
||||
// salto triangoli cancellati o gi� assegnati
|
||||
if ( m_vTria[i].nIdVert[0] == SVT_DEL ||
|
||||
abs( m_vTria[i].nTempPart) != 1)
|
||||
continue ;
|
||||
@@ -1451,7 +1451,7 @@ SurfTriMesh::RemoveTJunctions(void)
|
||||
for ( int nT = 0 ; nT < int( m_vTria.size()) ; ++ nT) {
|
||||
// Riga di matrice per il triangolo
|
||||
INTVECTOR& vIndexRow = vvIndexMatrix[nT] ;
|
||||
// Se il triangolo non è valido, passo al successivo
|
||||
// Se il triangolo non � valido, passo al successivo
|
||||
Triangle3d trTria ;
|
||||
if ( ! GetTriangle( nT, trTria) || ! trTria.Validate( true))
|
||||
continue ;
|
||||
@@ -1464,7 +1464,7 @@ SurfTriMesh::RemoveTJunctions(void)
|
||||
for ( int nSeg = 0 ; nSeg < 3 ; ++ nSeg) {
|
||||
// aggiungo alla riga della matrice il vertice iniziale del lato
|
||||
vIndexRow.emplace_back( m_vTria[nT].nIdVert[nSeg]) ;
|
||||
// Se in questo lato il triangolo è adiacente a un altro, lo salto.
|
||||
// Se in questo lato il triangolo � adiacente a un altro, lo salto.
|
||||
if ( m_vTria[nT].nIdAdjac[nSeg] != SVT_DEL && m_vTria[nT].nIdAdjac[nSeg] != SVT_NULL)
|
||||
continue ;
|
||||
int nPrevSize = int( vIndexRow.size()) ;
|
||||
@@ -1478,7 +1478,7 @@ SurfTriMesh::RemoveTJunctions(void)
|
||||
vtSeg /= dSegLen ;
|
||||
// Ciclo sui triangoli vicini
|
||||
for ( int nI = 0 ; nI < int( vNearTria.size()) ; ++ nI) {
|
||||
// Salto il triangolo se è quello di riferimento
|
||||
// Salto il triangolo se � quello di riferimento
|
||||
if ( vNearTria[nI] == nT)
|
||||
continue ;
|
||||
// Cerco i vertici che stanno sul lato del triangolo
|
||||
@@ -1518,7 +1518,7 @@ SurfTriMesh::RemoveTJunctions(void)
|
||||
++ itN ;
|
||||
itI = vvIndexMatrix[nT].erase( itN, itJ) ;
|
||||
}
|
||||
// Se il triangolo non è valido, passo al successivo
|
||||
// Se il triangolo non � valido, passo al successivo
|
||||
Triangle3d trTria ;
|
||||
if ( ! GetTriangle( nT, trTria) || ! trTria.Validate( true))
|
||||
continue ;
|
||||
@@ -1621,7 +1621,7 @@ SurfTriMesh::ScanForTripleTriangles( bool& bModified)
|
||||
bool bCirc ;
|
||||
INTVECTOR vTriaIndex ;
|
||||
int nTriaNum = GetAllTriaAroundVertex( nV, vTriaIndex, bCirc) ;
|
||||
// Se il vertice è condiviso da tre triangoli tutti adiacenti fra loro a due a due
|
||||
// Se il vertice � condiviso da tre triangoli tutti adiacenti fra loro a due a due
|
||||
if ( nTriaNum == 3 && bCirc) {
|
||||
// Valuto parallelismo fra le normali
|
||||
int nParallel = 0 ;
|
||||
@@ -1634,7 +1634,7 @@ SurfTriMesh::ScanForTripleTriangles( bool& bModified)
|
||||
}
|
||||
// Se sono tutte parallele fra loro unisco i tre triangoli in uno
|
||||
if ( nParallel == 3) {
|
||||
// Cerco gli altri triangoli adiacenti a quelli che sostituirò con il triangolo grande.
|
||||
// Cerco gli altri triangoli adiacenti a quelli che sostituir� con il triangolo grande.
|
||||
// Cerco anche quali lati dei tre triangoli che saranno eliminati sono adiacenti a quelli esterni
|
||||
INTVECTOR vVertAndAdjTria ;
|
||||
for ( int nTria = 0 ; nTria < 3 ; ++ nTria) {
|
||||
@@ -1646,7 +1646,7 @@ SurfTriMesh::ScanForTripleTriangles( bool& bModified)
|
||||
}
|
||||
}
|
||||
}
|
||||
// Cerco fra questi altri triangoli esterni sono adiacenti ai triangoli che eliminerò
|
||||
// Cerco fra questi altri triangoli esterni sono adiacenti ai triangoli che eliminer�
|
||||
int nAdjTriaContactEdge[3] ;
|
||||
for ( int nAdjTria = 1 ; nAdjTria < 6 ; nAdjTria += 2) {
|
||||
for ( int nAdjEdge = 0 ; nAdjEdge < 3 ; ++ nAdjEdge) {
|
||||
@@ -1709,19 +1709,19 @@ SurfTriMesh::FlipTriangles( int nTA, int nTB)
|
||||
if ( m_vTria[nTB].nIdAdjac[nEdgeB] == nTA)
|
||||
break ;
|
||||
}
|
||||
// Se uno è adiacente all'altro ma non viceversa, c'è un errore
|
||||
// Se uno � adiacente all'altro ma non viceversa, c'� un errore
|
||||
if ( ( nEdgeA == 3 && nEdgeB < 3) || ( nEdgeA < 3 && nEdgeB == 3))
|
||||
return false ;
|
||||
// Se non sono adiacenti, ho finito
|
||||
else if ( nEdgeA == 3 && nEdgeB == 3)
|
||||
return true ;
|
||||
// Se non trovo i vertici del triangolo A, c'è un errorre
|
||||
// Se non trovo i vertici del triangolo A, c'� un errorre
|
||||
Point3d ptSegSt, ptSegEn, ptVertA ;
|
||||
if ( ! GetVertex( m_vTria[nTA].nIdVert[nEdgeA], ptSegSt) ||
|
||||
! GetVertex( m_vTria[nTA].nIdVert[( nEdgeA + 1) % 3], ptSegEn) ||
|
||||
! GetVertex( m_vTria[nTA].nIdVert[( nEdgeA + 2) % 3], ptVertA))
|
||||
return false ;
|
||||
// Se non trovo i vertici del triangolo B, c'è un errorre
|
||||
// Se non trovo i vertici del triangolo B, c'� un errorre
|
||||
Point3d ptVertB ;
|
||||
if ( ! GetVertex( m_vTria[nTB].nIdVert[( nEdgeB + 2) % 3], ptVertB))
|
||||
return false ;
|
||||
@@ -2004,7 +2004,7 @@ SurfTriMesh::IntersFacetPlane( const SurfFlatRegion& Region, const Plane3d& plCu
|
||||
// Intersezione tra i piani delle due facce
|
||||
Point3d ptL ; Vector3d vtL ;
|
||||
int nResPP = IntersPlanePlane( plFacetPlane, plCutPlane, ptL, vtL) ;
|
||||
// Sono considerate non complanari, se c'è la retta d'intersezione è errore
|
||||
// Sono considerate non complanari, se c'� la retta d'intersezione � errore
|
||||
if ( nResPP == IPPT_NO || nResPP == IPPT_OVERLAPS)
|
||||
return FPI_ERROR ;
|
||||
|
||||
@@ -2026,7 +2026,7 @@ SurfTriMesh::IntersFacetPlane( const SurfFlatRegion& Region, const Plane3d& plCu
|
||||
// Classifico la linea di intersezione con la faccia
|
||||
CRVCVECTOR IntersectionResults ;
|
||||
bool bClassificationOk = Region.GetCurveClassification( cvPlaneIntersLine, 0.1 * EPS_SMALL, IntersectionResults) ;
|
||||
// Se non trovo le intersezioni, c'è un errore.
|
||||
// Se non trovo le intersezioni, c'� un errore.
|
||||
if ( ! bClassificationOk)
|
||||
return FPI_ERROR ;
|
||||
|
||||
@@ -2043,7 +2043,7 @@ SurfTriMesh::IntersFacetPlane( const SurfFlatRegion& Region, const Plane3d& plCu
|
||||
if ( ! IntersLinePart.empty())
|
||||
return FPI_CUT ;
|
||||
|
||||
// La linea si è ridotta ad un punto, la regione è tutta dentro o tutta fuori
|
||||
// La linea si � ridotta ad un punto, la regione � tutta dentro o tutta fuori
|
||||
Point3d ptCen ;
|
||||
if ( ! Region.GetChunkCentroid( 0, ptCen))
|
||||
return FPI_ERROR ;
|
||||
@@ -2288,7 +2288,7 @@ SurfTriMesh::SplitFacet( const INTERSCHAINMAP& IntersLineMap, PieceMap& NewFacet
|
||||
vNewPieces.back().nPiecePart = 1 ;
|
||||
GetFacetLoops( it->first, vNewPieces.back().vPieceLoop) ;
|
||||
// Divido la faccia in parti.
|
||||
// Ciclo sulle catene finché non esauriscono.
|
||||
// Ciclo sulle catene finch� non esauriscono.
|
||||
int nIterNumber = 0 ;
|
||||
int nPrevLastChainNum = int( cvOpenChain.size()) ;
|
||||
while ( int( cvOpenChain.size()) > 0) {
|
||||
@@ -2414,7 +2414,7 @@ SurfTriMesh::SplitFacet( const INTERSCHAINMAP& IntersLineMap, PieceMap& NewFacet
|
||||
NewLoopCCW = NewLoop2;
|
||||
NewLoopCW = NewLoop1;
|
||||
}
|
||||
// Creo il pezzo nuovo, il cui loop esterno è stato appena definito.
|
||||
// Creo il pezzo nuovo, il cui loop esterno � stato appena definito.
|
||||
FacetPiece DetachedPiece;
|
||||
DetachedPiece.vPieceLoop.emplace_back(NewLoopCCW);
|
||||
DetachedPiece.nPiecePart = bFirstLoopIsCounter ? 1 : -1;
|
||||
@@ -2592,7 +2592,7 @@ SurfTriMesh::SplitFacet( const INTERSCHAINMAP& IntersLineMap, PieceMap& NewFacet
|
||||
NewLoopCCW = NewLoop2 ;
|
||||
NewLoopCW = NewLoop1 ;
|
||||
}
|
||||
// // Creo il pezzo nuovo, il cui loop esterno è stato appena definito.
|
||||
// // Creo il pezzo nuovo, il cui loop esterno � stato appena definito.
|
||||
// FacetPiece PieceInn ;
|
||||
// PieceInn.vPieceLoop.emplace_back( NewLoop1) ;
|
||||
// PieceInn.nPiecePart = 1 ;
|
||||
@@ -2619,7 +2619,7 @@ SurfTriMesh::SplitFacet( const INTERSCHAINMAP& IntersLineMap, PieceMap& NewFacet
|
||||
// vNewPieces[nPart].vPieceLoop.emplace_back( NewLoop2) ;
|
||||
// vNewPieces[nPart].nPiecePart = - 1 ;
|
||||
// vNewPieces.emplace_back( PieceInn) ;
|
||||
// Creo il pezzo nuovo, il cui loop esterno è stato appena definito.
|
||||
// Creo il pezzo nuovo, il cui loop esterno � stato appena definito.
|
||||
FacetPiece DetachedPiece ;
|
||||
DetachedPiece.vPieceLoop.emplace_back( NewLoopCCW) ;
|
||||
DetachedPiece.nPiecePart = bFirstLoopIsCounter ? 1 : - 1 ;
|
||||
@@ -2831,7 +2831,7 @@ SurfTriMesh::EdgeInteriorContactManager( const SurfTriMesh& OthSurf,
|
||||
GetAllTriaInFacet( nFacet, vFacetTria) ;
|
||||
// Versore normale alla faccia.
|
||||
Vector3d vtN = m_vTria[m_vFacet[nFacet]].vtN ;
|
||||
// Se la faccia è stata tagliata, salto alla prossima faccia.
|
||||
// Se la faccia � stata tagliata, salto alla prossima faccia.
|
||||
if ( InterInterLineMap.find( nFacet) != InterInterLineMap.end())
|
||||
continue ;
|
||||
int nInOutPart = 0 ;
|
||||
@@ -2928,7 +2928,7 @@ SurfTriMesh::EdgeEdgeContactManager( const SurfTriMesh& OthSurf,
|
||||
GetAllTriaInFacet( nFacet, vFacetTria) ;
|
||||
// Versore normale alla faccia.
|
||||
Vector3d vtN = m_vTria[m_vFacet[nFacet]].vtN ;
|
||||
// Se la faccia è stata tagliata, salto alla prossima faccia.
|
||||
// Se la faccia � stata tagliata, salto alla prossima faccia.
|
||||
if ( InterInterLineMap.find( nFacet) != InterInterLineMap.end())
|
||||
continue ;
|
||||
int nInOutPart = 0 ;
|
||||
@@ -2989,7 +2989,7 @@ SurfTriMesh::EdgeEdgeContactManager( const SurfTriMesh& OthSurf,
|
||||
if ( nOthFacet2 != int( Edge.vOthFacetIndex.size()))
|
||||
break ;
|
||||
}
|
||||
// Se l'indice interno/esterno non è stato assegnato
|
||||
// Se l'indice interno/esterno non � stato assegnato
|
||||
if ( nInOutPart == 0) {
|
||||
// Se non ho trovato una coppia di facce, uso la prima.
|
||||
if ( ( nOthFacet1 == int( Edge.vOthFacetIndex.size()) - 1 && nOthFacet2 == int( Edge.vOthFacetIndex.size())) || nOthFacet2 == - 1) {
|
||||
@@ -3104,8 +3104,8 @@ SurfTriMesh::RetriangulateFacetPieces( const PieceMap& NewFacet,
|
||||
int nNewId[3] = { AddVertex( vPt[nNewTriaVertId[0]]),
|
||||
AddVertex( vPt[nNewTriaVertId[1]]),
|
||||
AddVertex( vPt[nNewTriaVertId[2]])} ;
|
||||
// Il colore passato nel secondo parametro è definito perché il vettore delle facce ha ancora salvato l'indice di un suo triangolo e
|
||||
// il triangolo è cancellato semplicente assegnadno la costante apposita VT_DEL (-2) a nIdVert[0]; ma il suo colore resta definito.
|
||||
// Il colore passato nel secondo parametro � definito perch� il vettore delle facce ha ancora salvato l'indice di un suo triangolo e
|
||||
// il triangolo � cancellato semplicente assegnadno la costante apposita VT_DEL (-2) a nIdVert[0]; ma il suo colore resta definito.
|
||||
int nNewTriaNum = AddTriangle( nNewId, m_vTria[m_vFacet[it->first]].nTFlag) ;
|
||||
if ( IsValidSvt( nNewTriaNum)) {
|
||||
// Assegno l'indice della parte interno/esterno.
|
||||
@@ -3203,7 +3203,7 @@ SurfTriMesh::IntersectTriMeshFacets( SurfTriMesh& Other)
|
||||
INTERSCHAINMAP IntersLineMapA, IntersLineMapB ;
|
||||
INTERSEDGEMAP EdgeInnLineMapA, EdgeInnLineMapB ;
|
||||
INTERSEDGEMAP EdgeEdgeLineMapA, EdgeEdgeLineMapB ;
|
||||
// Setto il triangolo come né fuori né dentro
|
||||
// Setto il triangolo come n� fuori n� dentro
|
||||
int nTriaNumA = GetTriangleSize();
|
||||
int nTriaNumB = SurfB.GetTriangleSize();
|
||||
for ( int nTA = 0 ; nTA < nTriaNumA ; ++ nTA) {
|
||||
@@ -3402,7 +3402,7 @@ SurfTriMesh::IntersectTriMeshFacets( SurfTriMesh& Other)
|
||||
EdgeEdgeContactManager( SurfB, IntersLineMapA, EdgeEdgeLineMapA) ;
|
||||
SurfB.EdgeEdgeContactManager( *this, IntersLineMapB, EdgeEdgeLineMapB) ;
|
||||
|
||||
// Se non ci sono stati tagli, valuto se una è tutta interna all'altra.
|
||||
// Se non ci sono stati tagli, valuto se una � tutta interna all'altra.
|
||||
if ( int( NewFacetA.size() + NewFacetB.size()) == 0) {
|
||||
int nVertNum = 0 ;
|
||||
Point3d ptVert ;
|
||||
@@ -3435,7 +3435,7 @@ SurfTriMesh::IntersectTriMeshFacets( SurfTriMesh& Other)
|
||||
++ nVertNum ;
|
||||
}
|
||||
}
|
||||
// Se la superficie A non è interna valuto la posizione della superficie B.
|
||||
// Se la superficie A non � interna valuto la posizione della superficie B.
|
||||
int nInOutNumB = nInOutNumA == 1 ? - 1 : 0 ;
|
||||
if ( nInOutNumB == 0) {
|
||||
nVertNum = 0 ;
|
||||
@@ -3469,8 +3469,8 @@ SurfTriMesh::IntersectTriMeshFacets( SurfTriMesh& Other)
|
||||
}
|
||||
}
|
||||
}
|
||||
// Se la posizione della superficie A rispetto alla B non è definita e
|
||||
// B è esterna ad A, allora assumiamo che siano reciprocamente esterne.
|
||||
// Se la posizione della superficie A rispetto alla B non � definita e
|
||||
// B � esterna ad A, allora assumiamo che siano reciprocamente esterne.
|
||||
if ( nInOutNumA == 0 && nInOutNumB == - 1)
|
||||
nInOutNumA = - 1 ;
|
||||
// Assegno gli indici interni/esterni.
|
||||
@@ -3698,7 +3698,7 @@ SurfTriMesh::IntersectTriMeshFacets( SurfTriMesh& Other)
|
||||
// Resetto e ricalcolo la HashGrid della superficie B
|
||||
SurfB.ResetHashGrids3d() ;
|
||||
for ( int nTA = 0 ; nTA < nTriaNum2A ; ++ nTA) {
|
||||
// Se il triangolo A non è valido, continuo
|
||||
// Se il triangolo A non � valido, continuo
|
||||
Triangle3d trTriaA ;
|
||||
if ( ! GetTriangle( nTA, trTriaA) || ! trTriaA.Validate( true))
|
||||
continue ;
|
||||
@@ -3709,7 +3709,7 @@ SurfTriMesh::IntersectTriMeshFacets( SurfTriMesh& Other)
|
||||
INTVECTOR vNearTria ;
|
||||
SurfB.GetAllTriaOverlapBox( b3dTriaA, vNearTria) ;
|
||||
for ( int nTB = 0 ; nTB < int( vNearTria.size()) ; ++ nTB) {
|
||||
// Se il triangolo B non è valido, continuo
|
||||
// Se il triangolo B non � valido, continuo
|
||||
Triangle3d trTriaB ;
|
||||
if ( ! SurfB.GetTriangle( vNearTria[nTB], trTriaB) || ! trTriaB.Validate( true))
|
||||
continue ;
|
||||
@@ -3724,12 +3724,15 @@ SurfTriMesh::IntersectTriMeshFacets( SurfTriMesh& Other)
|
||||
bSuccesfullInters = IsPointInsideTriangle( ptIntTriaCentroid, trTriaA, TriangleType::EXACT) &&
|
||||
IsPointInsideTriangle( ptIntTriaCentroid, trTriaB, TriangleType::EXACT) ;
|
||||
}
|
||||
// Se l'intersezeione è corretta e i triangoli sono sovrapposti aggiorno gli indici.
|
||||
// Se l'intersezeione � corretta e i triangoli sono sovrapposti aggiorno gli indici.
|
||||
<<<<<<< HEAD
|
||||
/*if ( nIntTypeAB == ITTT_OVERLAPS && bSuccesfullInters) {
|
||||
bool bInvertB = trTriaA.GetN() * trTriaB.GetN() < 0. ;
|
||||
m_vTria[nTA].nTempPart = ( bInvertB ? -2 : 2) ;
|
||||
SurfB.m_vTria[vNearTria[nTB]].nTempPart = ( bInvertB ? - 2 : 2) ;
|
||||
}*/
|
||||
=======
|
||||
>>>>>>> ca83aaa249ef66937ccc16640c11d72bd2f04c55
|
||||
if ( nIntTypeAB == ITTT_OVERLAPS && bSuccesfullInters) {
|
||||
m_vTria[nTA].nTempPart = 2 ;
|
||||
SurfB.m_vTria[vNearTria[nTB]].nTempPart = 2 ;
|
||||
|
||||
+2
-2
@@ -57,7 +57,7 @@ SurfTriMesh::Cut( const Plane3d& plPlane, bool bSaveOnEq)
|
||||
|
||||
// se superficie originale a facce, cerco di semplificarle in ogni caso
|
||||
if ( nFacetOriCnt < 200 || double( nTriaOriCnt) / nFacetOriCnt > 4) {
|
||||
if ( ! SimplifyFacets( 500.0))
|
||||
if ( ! SimplifyFacets( 5000.0))
|
||||
LOG_ERROR( GetEGkLogger(), "Error in SimplifyFacets of Stm::Cut")
|
||||
}
|
||||
|
||||
@@ -866,7 +866,7 @@ SurfTriMesh::GeneralizedCut( const ICurve& cvCurve, bool bSaveOnEq)
|
||||
|
||||
// se superficie originale a facce, cerco di semplificarle in ogni caso
|
||||
if ( nFacetOriCnt < 200 || double( nTriaOriCnt) / nFacetOriCnt > 4) {
|
||||
if ( ! SimplifyFacets( 500.0))
|
||||
if ( ! SimplifyFacets( 5000.0))
|
||||
LOG_ERROR( GetEGkLogger(), "Error in SimplifyFacets of Stm::GeneralizedCut")
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user