From 80070cc6085b62f497fc20108ec9d47d38918d22 Mon Sep 17 00:00:00 2001 From: DarioS Date: Fri, 14 May 2021 17:17:27 +0200 Subject: [PATCH] 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. --- CurveComposite.cpp | 7 +- EgtGeomKernel.rc | Bin 11710 -> 11710 bytes IntersSurfTmSurfTm.cpp | 4 +- IntersTriaTria.cpp | 229 +++++++++++++++------------------------- SurfTriMesh.cpp | 26 +++-- SurfTriMeshBooleans.cpp | 71 ++++++------- 6 files changed, 136 insertions(+), 201 deletions(-) diff --git a/CurveComposite.cpp b/CurveComposite.cpp index 7801339..65ed355 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -179,6 +179,9 @@ CurveComposite::AddSimpleCurve( ICurve* pSmplCrv, bool bEndOrStart, double dLinT if ( m_nStatus != OK && ! ( m_CrvSmplS.empty() && m_nStatus == TO_VERIFY)) return false ; + // controllo la tolleranza + dLinTol = max( dLinTol, EPS_SMALL) ; + // verifico che il parametro sia una curva semplice if ( ! pCrv->IsSimple()) return false ; @@ -199,7 +202,7 @@ CurveComposite::AddSimpleCurve( ICurve* pSmplCrv, bool bEndOrStart, double dLinT // verifico sia in continuità con il finale attuale Point3d ptEnd ; GetEndPoint( ptEnd) ; - if ( ! AreSamePointApprox( ptCrvStart, ptEnd)) { + if ( ! AreSamePointEpsilon( ptCrvStart, ptEnd, 0.01 * EPS_SMALL)) { // se in tolleranza, modifico l'inizio dell'entità if ( SqDist( ptCrvStart, ptEnd) < ( dLinTol * dLinTol)) { if ( ! pCrv->ModifyStart( ptEnd)) @@ -214,7 +217,7 @@ CurveComposite::AddSimpleCurve( ICurve* pSmplCrv, bool bEndOrStart, double dLinT // verifico sia in continuità con l'iniziale attuale Point3d ptStart ; GetStartPoint( ptStart) ; - if ( ! AreSamePointApprox( ptCrvEnd, ptStart)) { + if ( ! AreSamePointEpsilon( ptCrvEnd, ptStart, 0.01 * EPS_SMALL)) { // se in tolleranza, modifico la fine dell'entità if ( SqDist( ptCrvEnd, ptStart) < ( dLinTol * dLinTol)) { if ( ! pCrv->ModifyEnd( ptStart)) diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 82ca64783efce79a9008a7b39e092b091ecbc202..2de34259d930ef32301edb169d524a984c7e6807 100644 GIT binary patch delta 118 zcmdlNy)SyhH#SyN1|0^&&A-{?nVC}=3@0mc>u&bq>S2M3-{!MM7I$OZ+#~G9j8n2h Q8ZL=uq6g#VEaea`09ZC23IG5A delta 118 zcmdlNy)SyhH#Sxi1|0_D&A-{?nVC}u&bq>S2M3-{!MM7I$OZ+#~G9j8n2h Q8ZL=uq6g#VEaea`09p(l5&!@I diff --git a/IntersSurfTmSurfTm.cpp b/IntersSurfTmSurfTm.cpp index c12ccc3..4a07e49 100644 --- a/IntersSurfTmSurfTm.cpp +++ b/IntersSurfTmSurfTm.cpp @@ -77,8 +77,8 @@ IntersSurfTmSurfTm( const ISurfTriMesh& Stm1, const ISurfTriMesh& Stm2, TRIA3DVECTOR vIttTria ; int nRes = IntersTriaTria( TriaA, TriaB, ptInt, ptInt2, vIttTria) ; // se punto - if ( nRes == ITTT_VERT_VERT || nRes == ITTT_VERT_EDGE || nRes == ITTT_VERT_INT || - nRes == ITTT_EDGE_VERT || nRes == ITTT_EDGE_EDGE_PNT || nRes == ITTT_INT_VERT) { + if ( nRes == ITTT_VERT_VERT || nRes == ITTT_VERT_EDGE || nRes == ITTT_EDGE_VERT || + nRes == ITTT_VERT_INT || nRes == ITTT_INT_VERT || nRes == ITTT_EDGE_EDGE_PNT) { // verifico se punto già inserito int nId ; if ( ! PtGrid.Find( ptInt, 10 * EPS_SMALL, nId)) { diff --git a/IntersTriaTria.cpp b/IntersTriaTria.cpp index 8aa5378..03cf31e 100644 --- a/IntersTriaTria.cpp +++ b/IntersTriaTria.cpp @@ -34,7 +34,7 @@ static int FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& //---------------------------------------------------------------------------- int -IntersTriaTria( const Triangle3d& trTria1, const Triangle3d& trTria2, Point3d& ptInt, Point3d& ptInt2, TRIA3DVECTOR& vTria, bool bSpecial) +IntersTriaTria( const Triangle3d& trTria1, const Triangle3d& trTria2, Point3d& ptInt, Point3d& ptInt2, TRIA3DVECTOR& vTria) { // piano del secondo triangolo Plane3d plTria2 ; @@ -89,9 +89,12 @@ IntersTriaTria( const Triangle3d& trTria1, const Triangle3d& trTria2, Point3d& p // limito la linea di intersezione con il primo triangolo Point3d ptSt1, ptEn1 ; int nRes1 = IntersCoplanarLineTria( ptL, vtL, 100.0, trTria1, ptSt1, ptEn1, false) ; + // limito la liena di intersezione con il secondo triangolo Point3d ptSt2, ptEn2 ; int nRes2 = IntersCoplanarLineTria( ptL, vtL, 100.0, trTria2, ptSt2, ptEn2, false) ; + + // eseguo classificazione double dIntStU, dIntEnU; int nIntType = FindTriaTriaIntersType( trTria1, trTria2, ptL, vtL, ( ptSt1 - ptL) * vtL, ( ptEn1 - ptL) * vtL, @@ -102,7 +105,7 @@ IntersTriaTria( const Triangle3d& trTria1, const Triangle3d& trTria2, Point3d& p ptInt2 = ptL + dIntEnU * vtL ; return nIntType ; } - return ITTT_NO; + return ITTT_NO ; } //---------------------------------------------------------------------------- @@ -202,32 +205,25 @@ 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 - if ( nRes1 == ILTT_SEGM) { + // Casi + switch ( nRes1) { + case ILTT_SEGM : if ( nRes2 == ILTT_SEGM) { if ( dEnU2 < dStU1 - EPS_SMALL) return ITTT_NO ; else if ( dEnU2 < dStU1 + EPS_SMALL) { - dIntStU = 0.5 * ( dStU1 + dEnU2) ; - dIntEnU = 0.5 * ( dStU1 + dEnU2) ; + dIntStU = ( dStU1 + dEnU2) / 2 ; + dIntEnU = dIntStU ; Point3d ptInt = ptLineSt + dIntStU * vtLineDir ; - bool bOnVert1 = false ; - bool bOnVert2 = false ; - for ( int n = 0 ; n < 3 ; ++ n) { - if ( AreSamePointApprox( trTria1.GetP( n), ptInt)) - bOnVert1 = true ; - if ( AreSamePointApprox( trTria2.GetP( n), ptInt)) - bOnVert2 = true ; - } - if ( bOnVert1) { - if ( bOnVert2) - return ITTT_VERT_VERT ; - else - return ITTT_VERT_EDGE ; - } + bool bOnVert1 = IsPointOnTriangleVertex( ptInt, trTria1) ; + bool bOnVert2 = IsPointOnTriangleVertex( ptInt, trTria2) ; + if ( bOnVert1 && bOnVert2) + return ITTT_VERT_VERT ; + else if ( bOnVert1) + return ITTT_VERT_EDGE ; else if ( bOnVert2) return ITTT_EDGE_VERT ; else @@ -239,23 +235,15 @@ FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& trTria2, co return ITTT_INT_INT_SEG ; } else if ( dStU2 < dEnU1 + EPS_SMALL) { - dIntStU = 0.5 * ( dStU2 + dEnU1) ; - dIntEnU = 0.5 * ( dStU2 + dEnU1) ; + dIntStU = ( dStU2 + dEnU1) / 2 ; + dIntEnU = dIntStU ; Point3d ptInt = ptLineSt + dIntStU * vtLineDir ; - bool bOnVert1 = false; - bool bOnVert2 = false; - for ( int n = 0 ; n < 3 ; ++ n) { - if ( AreSamePointApprox( trTria1.GetP( n), ptInt)) - bOnVert1 = true ; - if ( AreSamePointApprox( trTria2.GetP( n), ptInt)) - bOnVert2 = true ; - } - if ( bOnVert1) { - if ( bOnVert2) - return ITTT_VERT_VERT ; - else - return ITTT_VERT_EDGE ; - } + bool bOnVert1 = IsPointOnTriangleVertex( ptInt, trTria1) ; + bool bOnVert2 = IsPointOnTriangleVertex( ptInt, trTria2) ; + if ( bOnVert1 && bOnVert2) + return ITTT_VERT_VERT ; + else if ( bOnVert1) + return ITTT_VERT_EDGE ; else if ( bOnVert2) return ITTT_EDGE_VERT ; else @@ -268,18 +256,11 @@ FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& trTria2, co if ( dEnU2 < dStU1 - EPS_SMALL) return ITTT_NO ; else if ( dEnU2 < dStU1 + EPS_SMALL) { - dIntStU = 0.5 * ( dStU1 + dEnU2) ; - dIntEnU = 0.5 * ( dStU1 + dEnU2) ; + dIntStU = ( dStU1 + dEnU2) / 2 ; + dIntEnU = dIntStU ; Point3d ptInt = ptLineSt + dIntStU * vtLineDir ; - bool bOnVert1 = false ; - for ( int n = 0 ; n < 3 ; ++ n) { - if ( AreSamePointApprox( trTria1.GetP( n), ptInt)) - bOnVert1 = true ; - } - if ( bOnVert1) - return ITTT_VERT_VERT ; - else - return ITTT_EDGE_VERT ; + bool bOnVert1 = IsPointOnTriangleVertex( ptInt, trTria1) ; + return ( bOnVert1 ? ITTT_VERT_VERT : ITTT_EDGE_VERT) ; } else if ( dStU2 < dEnU1 - EPS_SMALL) { dIntStU = max( dStU1, dStU2) ; @@ -287,18 +268,11 @@ FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& trTria2, co return ITTT_INT_EDGE ; } else if ( dStU2 < dEnU1 + EPS_SMALL) { - dIntStU = 0.5 * ( dStU2 + dEnU1) ; - dIntEnU = 0.5 * ( dStU2 + dEnU1) ; + dIntStU = ( dStU2 + dEnU1) / 2 ; + dIntEnU = dIntStU ; Point3d ptInt = ptLineSt + dIntStU * vtLineDir ; - bool bOnVert1 = false ; - for ( int n = 0 ; n < 3 ; ++ n) { - if ( AreSamePointApprox( trTria1.GetP( n), ptInt)) - bOnVert1 = true ; - } - if ( bOnVert1) - return ITTT_VERT_VERT ; - else - return ITTT_EDGE_VERT ; + bool bOnVert1 = IsPointOnTriangleVertex( ptInt, trTria1) ; + return ( bOnVert1 ? ITTT_VERT_VERT : ITTT_EDGE_VERT) ; } else return ITTT_NO ; @@ -308,18 +282,11 @@ FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& trTria2, co if ( dStU2 < dStU1 - EPS_SMALL) return ITTT_NO ; else if ( dStU2 < dStU1 + EPS_SMALL) { - dIntStU = 0.5 * ( dStU1 + dStU2) ; - dIntEnU = 0.5 * ( dStU1 + dStU2) ; + dIntStU = ( dStU1 + dStU2) / 2 ; + dIntEnU = dIntStU ; Point3d ptInt = ptLineSt + dIntStU * vtLineDir ; - bool bOnVert1 = false ; - for ( int n = 0 ; n < 3 ; ++ n) { - if ( AreSamePointApprox( trTria1.GetP( n), ptInt)) - bOnVert1 = true ; - } - if ( bOnVert1) - return ITTT_VERT_VERT ; - else - return ITTT_EDGE_VERT ; + bool bOnVert1 = IsPointOnTriangleVertex( ptInt, trTria1) ; + return ( bOnVert1 ? ITTT_VERT_VERT : ITTT_EDGE_VERT) ; } else if ( dStU2 < dEnU1 - EPS_SMALL) { dIntStU = max( dStU1, dStU2) ; @@ -327,42 +294,29 @@ FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& trTria2, co return ITTT_INT_VERT ; } else if ( dStU2 < dEnU1 + EPS_SMALL) { - dIntStU = 0.5 * ( dStU2 + dEnU1) ; - dIntEnU = 0.5 * ( dStU2 + dEnU1) ; + dIntStU = ( dStU2 + dEnU1) / 2 ; + dIntEnU = dIntStU ; Point3d ptInt = ptLineSt + dIntStU * vtLineDir ; - bool bOnVert1 = false ; - for ( int n = 0 ; n < 3 ; ++ n) { - if ( AreSamePointApprox( trTria1.GetP( n), ptInt)) - bOnVert1 = true ; - } - if ( bOnVert1) - return ITTT_VERT_VERT ; - else - return ITTT_EDGE_VERT ; + bool bOnVert1 = IsPointOnTriangleVertex( ptInt, trTria1) ; + return ( bOnVert1 ? ITTT_VERT_VERT : ITTT_EDGE_VERT) ; } else return ITTT_NO ; } else return ITTT_NO ; - } - else if ( nRes1 == ILTT_SEGM_ON_EDGE) { + break ; + + case ILTT_SEGM_ON_EDGE : if ( nRes2 == ILTT_SEGM) { if ( dEnU2 < dStU1 - EPS_SMALL) return ITTT_NO ; else if ( dEnU2 < dStU1 + EPS_SMALL) { - dIntStU = 0.5 * ( dStU1 + dEnU2) ; - dIntEnU = 0.5 * ( dStU1 + dEnU2) ; + dIntStU = ( dStU1 + dEnU2) /2 ; + dIntEnU = dIntStU ; Point3d ptInt = ptLineSt + dIntStU * vtLineDir ; - bool bOnVert2 = false ; - for ( int n = 0 ; n < 3 ; ++ n) { - if ( AreSamePointApprox( trTria2.GetP( n), ptInt)) - bOnVert2 = true ; - } - if ( bOnVert2) - return ITTT_VERT_VERT ; - else - return ITTT_VERT_EDGE ; + bool bOnVert2 = IsPointOnTriangleVertex( ptInt, trTria2) ; + return ( bOnVert2 ? ITTT_VERT_VERT : ITTT_VERT_EDGE) ; } else if ( dStU2 < dEnU1 - EPS_SMALL) { dIntStU = max( dStU1, dStU2) ; @@ -370,18 +324,11 @@ FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& trTria2, co return ITTT_EDGE_INT ; } else if ( dStU2 < dEnU1 + EPS_SMALL) { - dIntStU = 0.5 * ( dStU2 + dEnU1) ; - dIntEnU = 0.5 * ( dStU2 + dEnU1) ; + dIntStU = ( dStU2 + dEnU1) / 2 ; + dIntEnU = dIntStU ; Point3d ptInt = ptLineSt + dIntStU * vtLineDir ; - bool bOnVert2 = false ; - for ( int n = 0 ; n < 3 ; ++ n) { - if ( AreSamePointApprox( trTria2.GetP( n), ptInt)) - bOnVert2 = true ; - } - if ( bOnVert2) - return ITTT_VERT_VERT ; - else - return ITTT_VERT_EDGE ; + bool bOnVert2 = IsPointOnTriangleVertex( ptInt, trTria2) ; + return ( bOnVert2 ? ITTT_VERT_VERT : ITTT_VERT_EDGE) ; } else return ITTT_NO ; @@ -390,8 +337,8 @@ FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& trTria2, co if ( dEnU2 < dStU1 - EPS_SMALL) return ITTT_NO ; else if ( dEnU2 < dStU1 + EPS_SMALL) { - dIntStU = 0.5 * ( dStU1 + dEnU2) ; - dIntEnU = 0.5 * ( dStU1 + dEnU2) ; + dIntStU = ( dStU1 + dEnU2) / 2 ; + dIntEnU = dIntStU ; return ITTT_VERT_VERT ; } else if ( dStU2 < dEnU1 - EPS_SMALL) { @@ -400,8 +347,8 @@ FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& trTria2, co return ITTT_EDGE_EDGE_SEG ; } else if ( dStU2 < dEnU1 + EPS_SMALL) { - dIntStU = 0.5 * ( dStU2 + dEnU1) ; - dIntEnU = 0.5 * ( dStU2 + dEnU1) ; + dIntStU = ( dStU2 + dEnU1) / 2 ; + dIntEnU = dIntStU ; return ITTT_VERT_VERT ; } else @@ -412,8 +359,8 @@ FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& trTria2, co if ( dEnU2 < dStU1 - EPS_SMALL) return ITTT_NO ; else if ( dEnU2 < dStU1 + EPS_SMALL) { - dIntStU = 0.5 * ( dStU1 + dEnU2) ; - dIntEnU = 0.5 * ( dStU1 + dEnU2) ; + dIntStU = ( dStU1 + dEnU2) / 2 ; + dIntEnU = dIntStU ; return ITTT_VERT_VERT ; } else if ( dStU2 < dEnU1 - EPS_SMALL) { @@ -422,8 +369,8 @@ FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& trTria2, co return ITTT_EDGE_VERT ; } else if ( dStU2 < dEnU1 + EPS_SMALL) { - dIntStU = 0.5 * ( dStU2 + dEnU1) ; - dIntEnU = 0.5 * ( dStU2 + dEnU1) ; + dIntStU = ( dStU2 + dEnU1) / 2 ; + dIntEnU = dIntStU ; return ITTT_VERT_VERT ; } else @@ -431,25 +378,19 @@ FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& trTria2, co } else return ITTT_NO ; - } - else if ( nRes1 == ILTT_VERT) { + break ; + + case ILTT_VERT : dEnU1 = dStU1 ; if ( nRes2 == ILTT_SEGM) { if ( dEnU2 < dStU1 - EPS_SMALL) return ITTT_NO ; else if ( dEnU2 < dStU1 + EPS_SMALL) { - dIntStU = 0.5 * ( dStU1 + dEnU2) ; - dIntEnU = 0.5 * ( dStU1 + dEnU2) ; + dIntStU = ( dStU1 + dEnU2) / 2 ; + dIntEnU = dIntStU ; Point3d ptInt = ptLineSt + dIntStU * vtLineDir ; - bool bOnVert2 = false ; - for ( int n = 0 ; n < 3 ; ++ n) { - if ( AreSamePointApprox( trTria2.GetP( n), ptInt)) - bOnVert2 = true ; - } - if ( bOnVert2) - return ITTT_VERT_VERT ; - else - return ITTT_VERT_EDGE ; + bool bOnVert2 = IsPointOnTriangleVertex( ptInt, trTria2) ; + return ( bOnVert2 ? ITTT_VERT_VERT : ITTT_VERT_EDGE) ; } else if ( dStU2 < dEnU1 - EPS_SMALL) { dIntStU = max( dStU1, dStU2) ; @@ -457,18 +398,11 @@ FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& trTria2, co return ITTT_VERT_INT ; } else if ( dStU2 < dEnU1 + EPS_SMALL) { - dIntStU = 0.5 * ( dStU2 + dEnU1) ; - dIntEnU = 0.5 * ( dStU2 + dEnU1) ; + dIntStU = ( dStU2 + dEnU1) / 2 ; + dIntEnU = dIntStU ; Point3d ptInt = ptLineSt + dIntStU * vtLineDir ; - bool bOnVert2 = false ; - for ( int n = 0 ; n < 3 ; ++ n) { - if ( AreSamePointApprox( trTria2.GetP( n), ptInt)) - bOnVert2 = true ; - } - if ( bOnVert2) - return ITTT_VERT_VERT ; - else - return ITTT_VERT_EDGE ; + bool bOnVert2 = IsPointOnTriangleVertex( ptInt, trTria2) ; + return ( bOnVert2 ? ITTT_VERT_VERT : ITTT_VERT_EDGE) ; } else return ITTT_NO ; @@ -477,8 +411,8 @@ FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& trTria2, co if ( dEnU2 < dStU1 - EPS_SMALL) return ITTT_NO ; else if ( dEnU2 < dStU1 + EPS_SMALL) { - dIntStU = 0.5 * ( dStU1 + dEnU2) ; - dIntEnU = 0.5 * ( dStU1 + dEnU2) ; + dIntStU = ( dStU1 + dEnU2) / 2 ; + dIntEnU = dIntStU ; return ITTT_VERT_VERT ; } else if ( dStU2 < dEnU1 - EPS_SMALL) { @@ -487,8 +421,8 @@ FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& trTria2, co return ITTT_VERT_EDGE ; } else if ( dStU2 < dEnU1 + EPS_SMALL) { - dIntStU = 0.5 * ( dStU1 + dStU2) ; - dIntEnU = 0.5 * ( dStU1 + dStU2) ; + dIntStU = ( dStU1 + dStU2) / 2 ; + dIntEnU = dIntStU ; return ITTT_VERT_VERT ; } else @@ -498,8 +432,8 @@ FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& trTria2, co if ( dStU2 < dStU1 - EPS_SMALL) return ITTT_NO ; else if ( dStU2 < dStU1 + EPS_SMALL) { - dIntStU = 0.5 * ( dStU1 + dStU2) ; - dIntEnU = 0.5 * ( dStU1 + dStU2) ; + dIntStU = ( dStU1 + dStU2) / 2 ; + dIntEnU = dIntStU ; return ITTT_VERT_VERT ; } else @@ -507,7 +441,12 @@ FindTriaTriaIntersType( const Triangle3d& trTria1, const Triangle3d& trTria2, co } else return ITTT_NO ; + break ; + + case ILTT_EDGE : + LOG_ERROR( GetEGkLogger(), "FindTriaTriaIntersType : ILTT_EDGE should never happen") + break ; } - else - return ITTT_NO ; + + return ITTT_NO ; } diff --git a/SurfTriMesh.cpp b/SurfTriMesh.cpp index e1d4955..bd21a5a 100644 --- a/SurfTriMesh.cpp +++ b/SurfTriMesh.cpp @@ -3301,7 +3301,7 @@ SurfTriMesh::Invert( void) bool SurfTriMesh::Cut( const Plane3d& plPlane, bool bSaveOnEq) { -#define UseTria 0 +#define UseTria 1 #if UseTria // la superficie deve essere validata if ( m_nStatus != OK) @@ -3515,36 +3515,32 @@ SurfTriMesh::Cut( const Plane3d& plPlane, bool bSaveOnEq) } return true ; -#endif -#if ! UseTria +#else bool bModif = false ; - // Setto il triangolo come né fuori né dentro. - int nTriaNum = GetTriangleSize(); + // Setto i triangoli come né fuori né dentro. + int nTriaNum = GetTriangleSize() ; for ( int nT = 0 ; nT < nTriaNum ; ++ nT) { m_vTria[nT].nTempPart = 0 ; } INTERSCHAINMAP IntersLineMap ; - INTERSEDGEMAP EdgeInterLineMap ; - INTERSEDGEMAP EdgeEdgeLineMap ; - // Ciclo su tutte le facce. + // Ciclo su tutte le facce. int nFacetNum = GetFacetCount() ; for ( int nF = 0 ; nF < nFacetNum ; ++ nF) { - // Dati della faccia + // Dati della faccia POLYLINEVECTOR vLoopVec ; GetFacetLoops( nF, vLoopVec) ; if ( vLoopVec.empty()) continue ; PtrOwner pReg( GetBasicSurfFlatRegion( GetSurfFlatRegionFromPolyLineVector( vLoopVec))) ; - if ( pReg == nullptr) + if ( IsNull( pReg)) return false ; - SurfFlatRegion Region = *pReg ; LineFacetClassVector IntersLinePart ; - int nIntType = IntersFacetPlane( Region, vLoopVec[0], plPlane, IntersLinePart) ; + int nIntType = IntersFacetPlane( *pReg, vLoopVec[0], plPlane, IntersLinePart) ; if ( nIntType == FacetPlaneIntersType::FPI_CUT) { for ( int nPart = 0 ; nPart < int( IntersLinePart.size()) ; ++ nPart) { // Salvo intersezione per la faccia. @@ -3561,7 +3557,7 @@ SurfTriMesh::Cut( const Plane3d& plPlane, bool bSaveOnEq) INTVECTOR vT ; GetAllTriaInFacet( nF, vT) ; for ( auto& nT : vT) - m_vTria[nT].nTempPart = Region.GetNormVersor() * plPlane.GetVersN() > 0. ? 2 : - 2 ; + m_vTria[nT].nTempPart = pReg->GetNormVersor() * plPlane.GetVersN() > 0. ? 2 : - 2 ; } else if ( nIntType == FacetPlaneIntersType::FPI_INN) { INTVECTOR vT ; @@ -3578,9 +3574,11 @@ SurfTriMesh::Cut( const Plane3d& plPlane, bool bSaveOnEq) else ; } - // Divido le facce. + + // Divido le facce. PieceMap NewFacet ; SplitFacet( IntersLineMap, NewFacet) ; + INTERSEDGEMAP EdgeInterLineMap, EdgeEdgeLineMap ; RetriangulateFacetPieces( NewFacet, EdgeInterLineMap, EdgeEdgeLineMap) ; int nNumTria = GetTriangleSize() ; diff --git a/SurfTriMeshBooleans.cpp b/SurfTriMeshBooleans.cpp index f4069fd..94f1e55 100644 --- a/SurfTriMeshBooleans.cpp +++ b/SurfTriMeshBooleans.cpp @@ -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 } //----------------------------------------------------------------------------