EgtGeomKernel 2.3e1 :

- inserite modifiche LorenzoM per intersezioni tra triangoli e tra trimesh e piani
- in CurveComposite quando si aggiungono le curve si fa coincidere l'inizio della nuova curva con la fine dell'ultima precedente.
This commit is contained in:
DarioS
2021-05-14 17:17:27 +02:00
parent 0b37e12df9
commit 80070cc608
6 changed files with 136 additions and 201 deletions
+33 -38
View File
@@ -1785,7 +1785,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
// Interseco i triangoli
Point3d ptSegSt, ptSegEn ;
TRIA3DVECTOR vTria ;
int nIntType = IntersTriaTria( trTriaA, trTriaB, ptSegSt, ptSegEn, vTria, true) ;
int nIntType = IntersTriaTria( trTriaA, trTriaB, ptSegSt, ptSegEn, vTria) ;
if ( nIntType == ITTT_EDGE_EDGE_SEG ||
nIntType == ITTT_EDGE_INT ||
nIntType == ITTT_INT_EDGE ||
@@ -2427,12 +2427,11 @@ SurfTriMesh::Intersect( const ISurfTriMesh& Other)
m_OGrMgr.Clear() ;
SurfTriMesh SurfB ;
SurfB.CopyFrom( &Other) ;
//Frame3d frScalingRef ;
//frScalingRef.Set( m_vVert[0].ptP, X_AX, Y_AX, Z_AX) ;
//Scale( frScalingRef, BOOLEAN_SCALE, BOOLEAN_SCALE, BOOLEAN_SCALE) ;
//SurfB.Scale( frScalingRef, BOOLEAN_SCALE, BOOLEAN_SCALE, BOOLEAN_SCALE) ;
//IntersectTriMeshTriangle( SurfB) ;
ItersectTriMeshFacets( SurfB) ;
Frame3d frScalingRef ;
frScalingRef.Set( m_vVert[0].ptP, X_AX, Y_AX, Z_AX) ;
Scale( frScalingRef, BOOLEAN_SCALE, BOOLEAN_SCALE, BOOLEAN_SCALE) ;
SurfB.Scale( frScalingRef, BOOLEAN_SCALE, BOOLEAN_SCALE, BOOLEAN_SCALE) ;
IntersectTriMeshTriangle( SurfB) ;
IdentifyParts() ;
SurfB.IdentifyParts() ;
int nTriaNumA = GetTriangleSize() ;
@@ -2453,13 +2452,13 @@ SurfTriMesh::Intersect( const ISurfTriMesh& Other)
AddTriangle( nNewVert, m_nMaxTFlag) ;
}
}
//bool bOk = ( AdjustVertices() && DoCompacting()) ;
//bOk && RemoveTripleTriangles() ;
//bOk = bOk && ( AdjustVertices() && DoCompacting()) ;
//bOk && RemoveTJunctions() ;
/*bOk = bOk*/return RemoveTJunctions() && ( AdjustVertices() && DoCompacting()) ;
//Scale( frScalingRef, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE) ;
/* return bOk ;*/
bool bOk = ( AdjustVertices() && DoCompacting()) ;
bOk && RemoveTripleTriangles() ;
bOk = bOk && ( AdjustVertices() && DoCompacting()) ;
bOk && RemoveTJunctions() ;
bOk = bOk && ( AdjustVertices() && DoCompacting()) ;
Scale( frScalingRef, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE) ;
return bOk ;
}
//----------------------------------------------------------------------------
@@ -2512,16 +2511,19 @@ SurfTriMesh::GetSurfClassification( const ISurfTriMesh& ClassifierSurf,
// Le superfici devono essere valide
if ( ! IsValid() || ! ClassifierSurf.IsValid())
return false ;
if ( ClassifierSurf.GetVertexCount() == 0 || ClassifierSurf.GetTriangleCount() == 0)
return false ;
if ( m_vVert.empty() || m_vTria.empty())
return true ;
SurfTriMesh SurfC ;
SurfC.CopyFrom( &ClassifierSurf) ;
//Frame3d frScalingRef ;
//frScalingRef.Set( m_vVert[0].ptP, X_AX, Y_AX, Z_AX) ;
//Scale( frScalingRef, BOOLEAN_SCALE, BOOLEAN_SCALE, BOOLEAN_SCALE) ;
//SurfC.Scale( frScalingRef, BOOLEAN_SCALE, BOOLEAN_SCALE, BOOLEAN_SCALE) ;
ItersectTriMeshFacets( SurfC) ;
//IntersectTriMeshTriangle( SurfC) ;
Frame3d frScalingRef ;
frScalingRef.Set( m_vVert[0].ptP, X_AX, Y_AX, Z_AX) ;
Scale( frScalingRef, BOOLEAN_SCALE, BOOLEAN_SCALE, BOOLEAN_SCALE) ;
SurfC.Scale( frScalingRef, BOOLEAN_SCALE, BOOLEAN_SCALE, BOOLEAN_SCALE) ;
IntersectTriMeshTriangle( SurfC) ;
IdentifyParts() ;
//Scale( frScalingRef, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE) ;
Scale( frScalingRef, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE) ;
int nTriaNum = GetTriangleSize() ;
for ( int nT = 0 ; nT < nTriaNum ; ++ nT) {
@@ -2611,31 +2613,29 @@ SurfTriMesh::IntersFacetPlane( const SurfFlatRegion& Region, const PolyLine& Ext
++ nVertNeg ;
}
#define FirstMode 1
#if FirstMode
// Tutto sul piano.
// Tutto sul piano.
if ( nVertPos == 0 && nVertNeg == 0)
return FPI_ON ;
// Tutto dentro
// Tutto dentro
else if ( nVertPos == 0)
return FPI_INN ;
// Tutto fuori
// Tutto fuori
else if ( nVertNeg == 0)
return FPI_OUT ;
// Intersezione tra i piani delle due facce
// Intersezione tra i piani delle due facce
Point3d ptL ; Vector3d vtL ;
int nResPP = IntersPlanePlane( plFacetPlane, plCutPlane, ptL, vtL) ;
// Non essendo complanari, se non trovo la retta d'intersezione c'è un errore.
// Non essendo complanari, se non trovo la retta d'intersezione c'è un errore.
if ( nResPP == IPPT_NO || nResPP == IPPT_OVERLAPS)
return FPI_ERROR ;
// Box contenente entrambe le regioni
// Box contenente entrambe le regioni
BBox3d b3Box ;
Region.GetLocalBBox( b3Box) ;
b3Box.Expand( 10) ;
// Limito la retta nel box contenente le regioni
// Limito la retta nel box contenente le regioni
INTDBLVECTOR vInters ;
if ( ! IntersLineBox( ptL, vtL, 100., b3Box, vInters, false) || int( vInters.size()) < 2)
return FPI_ERROR ;
@@ -2645,14 +2645,14 @@ SurfTriMesh::IntersFacetPlane( const SurfFlatRegion& Region, const PolyLine& Ext
CurveLine cvPlaneIntersLine ;
cvPlaneIntersLine.Set( ptIntLineSt, ptIntLineEn) ;
// Limito la linea di intersezione con la faccia.
// Limito la linea di intersezione con la faccia.
CRVCVECTOR IntersectionResults ;
bool bClassificationOk = Region.GetCurveClassification( cvPlaneIntersLine, IntersectionResults) ;
// Se non trovo le intersezioni, c'è un errore.
// Se non trovo le intersezioni, c'è un errore.
if ( ! bClassificationOk)
return FPI_ERROR ;
// Prendo la parte interna o sul bordo.
// Prendo la parte interna o sul bordo.
int nPartNum = int( IntersectionResults.size()) ;
for ( int n = 0 ; n < nPartNum ; ++ n) {
int nType = IntersectionResults[n].nClass ;
@@ -2664,11 +2664,6 @@ SurfTriMesh::IntersFacetPlane( const SurfFlatRegion& Region, const PolyLine& Ext
}
return int( IntersLinePart.size()) > 0 ;
#endif
#if ! FirstMode
return true;
#endif
}
//----------------------------------------------------------------------------