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:
+33
-38
@@ -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
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user