diff --git a/SurfTriMeshCuts.cpp b/SurfTriMeshCuts.cpp index a49e846..ec23f4e 100644 --- a/SurfTriMeshCuts.cpp +++ b/SurfTriMeshCuts.cpp @@ -503,10 +503,26 @@ SurfTriMesh::GeneralizedCut( const ICurve& cvCurve, bool bSaveOnEq) // Determino se il centro del triangolo cade all'interno della curva bool bTriaCenIn = false ; { - DistPointCurve dstPC( trTria.GetCentroid(), cvCompo) ; - int nSide ; - if ( dstPC.GetSideAtMinDistPoint( 0, vtExtr, nSide)) - bTriaCenIn = ( nSide == MDS_LEFT) ; + // centro proiettato sul piano della curva + Point3d ptCen = trTria.GetCentroid() ; + ptCen = ptCen - ( ptCen - ptStart) * vtExtr * vtExtr ; + // calcolo distanza + DistPointCurve dstPC( ptCen, cvCompo) ; + double dDist ; dstPC.GetDist( dDist) ; + // se maggiore oltre il limite originale + if ( dDist > CUT_SCALE * EPS_SMALL) { + int nSide ; + if ( dstPC.GetSideAtMinDistPoint( 0, vtExtr, nSide)) + bTriaCenIn = ( nSide == MDS_LEFT) ; + } + // altrimenti ricalcolo con centro del triangolo spostato all'interno sulla normale + else { + Point3d ptCen2 = trTria.GetCentroid() - CUT_SCALE * EPS_SMALL * trTria.GetN() ; + DistPointCurve dstP2C( ptCen2, cvCompo) ; + int nSide2 ; + if ( dstP2C.GetSideAtMinDistPoint( 0, vtExtr, nSide2)) + bTriaCenIn = ( nSide2 == MDS_LEFT && bSaveOnEq) ; + } } // Vettore di catene di punti @@ -577,6 +593,7 @@ SurfTriMesh::GeneralizedCut( const ICurve& cvCurve, bool bSaveOnEq) else ++ itI ; } + nChainCnt = int( vChain.size()) ; // unisco eventuali catene estreme che sono parte di una stessa catena if ( nChainCnt > 1) {