diff --git a/SurfTriMeshBooleans.cpp b/SurfTriMeshBooleans.cpp index 62902fe..d4b4e3d 100644 --- a/SurfTriMeshBooleans.cpp +++ b/SurfTriMeshBooleans.cpp @@ -1,7 +1,7 @@ //---------------------------------------------------------------------------- // EgalTech 2019-2020 //---------------------------------------------------------------------------- -// File : SurfTriMeshBooleans.cpp Data : 02.01.20 Versione : 2.2a1 +// File : SurfTriMeshBooleans.cpp Data : 13.03.20 Versione : 2.2c1 // Contenuto : Implementazione delle funzioni booleane per SurfFTrimesh. // // @@ -121,9 +121,10 @@ IntersRectangleTriangle( const Point3d& ptP, const Vector3d& vtL1, const Vector3 static bool ChangeStart( const Point3d& ptNewStart, PNTVECTOR& Loop) { - // Cerco se esiste un tratto del loop chiuso su cui giace il punto - int nSeg = - 1 ; - for ( int nPt = 0 ; nPt < int( Loop.size()) && nSeg == - 1 ; ++ nPt) { + // Cerco il tratto del loop chiuso pių vicino al punto + int nMinSeg = - 1 ; + double dMinSqDinst = DBL_MAX ; + for ( int nPt = 0 ; nPt < int( Loop.size()) ; ++ nPt) { // Estremi del segmento corrente del loop Point3d ptSegSt = Loop[nPt] ; Point3d ptSegEn = Loop[( nPt + 1) % int( Loop.size())] ; @@ -131,31 +132,32 @@ ChangeStart( const Point3d& ptNewStart, PNTVECTOR& Loop) DistPointLine dDistCalc( ptNewStart, ptSegSt, ptSegEn) ; double dSqDist ; dDistCalc.GetSqDist( dSqDist) ; - if ( dSqDist < SQ_EPS_SMALL) { - nSeg = nPt ; + if ( dSqDist < dMinSqDinst) { + dMinSqDinst = dSqDist ; + nMinSeg = nPt ; } } // Se il punto non sta sul loop, errore - if ( nSeg == - 1) + if ( dMinSqDinst > SQ_EPS_SMALL) return false ; // Verifico che il punto stia su un vertice, in tal caso non devo fare nulla - bool bOnStart = AreSamePointApprox( Loop[nSeg], ptNewStart) ; - bool bOnEnd = AreSamePointApprox( Loop[( nSeg + 1) % int( Loop.size())], ptNewStart) ; + bool bOnStart = AreSamePointApprox( Loop[nMinSeg], ptNewStart) ; + bool bOnEnd = AreSamePointApprox( Loop[( nMinSeg + 1) % int( Loop.size())], ptNewStart) ; if ( bOnStart || bOnEnd) { if ( bOnEnd) { - ++ nSeg ; - if ( nSeg % int( Loop.size()) == 0) + ++ nMinSeg ; + if ( nMinSeg % int( Loop.size()) == 0) return true ; } PNTVECTOR vTempVec ; - for ( int nPt = 0 ; nPt < nSeg ; ++ nPt) + for ( int nPt = 0 ; nPt < nMinSeg ; ++ nPt) vTempVec.emplace_back( Loop[nPt]) ; int nSize = int( Loop.size()) ; - for ( int nPt = 0 ; nPt < nSize - nSeg ; ++ nPt) { - Loop[nPt] = Loop[nPt + nSeg] ; + for ( int nPt = 0 ; nPt < nSize - nMinSeg ; ++ nPt) { + Loop[nPt] = Loop[nPt + nMinSeg] ; } for ( int nPt = 0 ; nPt < int( vTempVec.size()) ; ++ nPt) { - Loop[nPt + nSize - nSeg] = vTempVec[nPt] ; + Loop[nPt + nSize - nMinSeg] = vTempVec[nPt] ; } return true ; } @@ -163,14 +165,14 @@ ChangeStart( const Point3d& ptNewStart, PNTVECTOR& Loop) Loop.resize( Loop.size() + 1) ; // Copio i primi punti PNTVECTOR LoopTemp ; - for ( int nPt = 0 ; nPt <= nSeg ; ++ nPt) + for ( int nPt = 0 ; nPt <= nMinSeg ; ++ nPt) LoopTemp.emplace_back( Loop[nPt]) ; // Aggiungo il nuovo punto all'inizio Loop[0] = ptNewStart ; // Sposto gli ultimi in testa - int nLastPointNum = int( Loop.size()) - 1 - nSeg ; + int nLastPointNum = int( Loop.size()) - 1 - nMinSeg ; for ( int nPt = 1 ; nPt <= nLastPointNum ; ++ nPt) { - Loop[nPt] = Loop[nPt + nSeg] ; + Loop[nPt] = Loop[nPt + nMinSeg] ; } // Porto i primi in fondo for ( int nPt = 0 ; nPt < int( LoopTemp.size()) ; ++ nPt) { @@ -183,31 +185,33 @@ ChangeStart( const Point3d& ptNewStart, PNTVECTOR& Loop) static bool SplitAtPoint( const Point3d& ptStop, const PNTVECTOR& Loop, PNTVECTOR& Loop1, PNTVECTOR& Loop2) { - // Cerco se esiste un tratto del loop chiuso su cui giace il punto - int nSeg = - 1 ; - for ( int nPt = 0 ; nPt < int( Loop.size()) && nSeg == - 1 ; ++ nPt) { + // Cerco il tratto del loop chiuso pių vicino al punto + int nMinSeg = -1 ; + double dMinSqDinst = DBL_MAX; + for (int nPt = 0 ; nPt < int(Loop.size()) ; ++ nPt) { // Estremi del segmento corrente del loop Point3d ptSegSt = Loop[nPt] ; - Point3d ptSegEn = Loop[( nPt + 1) % int( Loop.size())] ; + Point3d ptSegEn = Loop[(nPt + 1) % int(Loop.size())] ; // Vedo se il punto giace sul segmento del loop DistPointLine dDistCalc( ptStop, ptSegSt, ptSegEn) ; double dSqDist ; dDistCalc.GetSqDist( dSqDist) ; - if ( dSqDist < SQ_EPS_SMALL) { - nSeg = nPt ; + if (dSqDist < dMinSqDinst) { + dMinSqDinst = dSqDist ; + nMinSeg = nPt ; } } // Se il punto non sta sul loop, errore - if ( nSeg == - 1) + if ( dMinSqDinst > SQ_EPS_SMALL) return false ; // Verifico che il punto stia su un vertice, in tal caso non devo aggiungerlo - bool bFirst = AreSamePointApprox( Loop[nSeg], ptStop) ; - bool bLast = AreSamePointApprox( Loop[( nSeg + 1) % int( Loop.size())], ptStop) ; + bool bFirst = AreSamePointApprox( Loop[nMinSeg], ptStop) ; + bool bLast = AreSamePointApprox( Loop[( nMinSeg + 1) % int( Loop.size())], ptStop) ; // Se il punto č sul vertice finale del segmento, aggiungo il vertice alla lista da inglobare al primo loop if ( bLast) - ++ nSeg ; + ++ nMinSeg ; // Inglobo fino a nSeg nel primo loop - for ( int nPt = 0 ; nPt <= nSeg ; ++ nPt) + for ( int nPt = 0 ; nPt <= nMinSeg ; ++ nPt) Loop1.emplace_back( Loop[nPt]) ; // Se il punto č interno al segmento, lo inglobo in entrambi i loop if ( ! ( bFirst || bLast)) { @@ -215,10 +219,10 @@ SplitAtPoint( const Point3d& ptStop, const PNTVECTOR& Loop, PNTVECTOR& Loop1, PN Loop2.emplace_back( ptStop) ; } else { - Loop2.emplace_back( Loop[nSeg]) ; + Loop2.emplace_back( Loop[nMinSeg]) ; } // Inglobo gli ultimi vertici in Loop2 - for ( int nPt = nSeg + 1 ; nPt < int( Loop.size()) ; ++ nPt) + for ( int nPt = nMinSeg + 1 ; nPt < int( Loop.size()) ; ++ nPt) Loop2.emplace_back( Loop[nPt]) ; Loop2.emplace_back( Loop[0]) ;