From ade2d9780403571ebc085774e2177f8561cdf9ae Mon Sep 17 00:00:00 2001 From: LorenzoM Date: Thu, 5 Aug 2021 15:22:08 +0200 Subject: [PATCH] =?UTF-8?q?Aggiunte=20nuove=20funzionalit=C3=A0=20Asportaz?= =?UTF-8?q?ioni=20volumi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VolZmap.h | 6 +- VolZmapVolume.cpp | 298 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 267 insertions(+), 37 deletions(-) diff --git a/VolZmap.h b/VolZmap.h index 00d29a8..ec73c68 100644 --- a/VolZmap.h +++ b/VolZmap.h @@ -327,8 +327,10 @@ class VolZmap : public IVolZmap, public IGeoObjRW bool SurfConus_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx, double dHei, double dMaxRad, double dMinRad, bool bOuterCutter, bool bTapB, bool bTapT, const Vector3d& vtArcNormMaxR, const Vector3d& vtArcNormMinR) ; - bool SurfSpherePart_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx, - double dRad, double dInfH, double dSupH, bool bOuterCutter) ; + bool SurfSphericalShellPart_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx, + double dRad, double dInfH, double dSupH, bool bOuterCutter) ; + bool SurfSphericalShell_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx, + double dRad, double dHei, bool bOuterCutter) ; // Intersezioni diff --git a/VolZmapVolume.cpp b/VolZmapVolume.cpp index 9d3fde7..ff0b9f9 100644 --- a/VolZmapVolume.cpp +++ b/VolZmapVolume.cpp @@ -1815,27 +1815,27 @@ VolZmap::GenTool_ZDrilling( int nGrid, const Point3d& ptS, const Point3d& ptE, c // Tagliente esterno if ( dEnH < dStH) { if ( dEnH > 0) { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, dEnH, dStH, true) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, dEnH, dStH, true) ; } else if ( dStH > 0) { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, 0, dStH, true) ; - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, 0, dEnH, true) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, 0, dStH, true) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, 0, dEnH, true) ; } else { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, dEnH, dStH, true) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, dEnH, dStH, true) ; } } // Tagliente interno else { if ( dEnH < 0) { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, abs( dEnH), abs( dStH), false) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, abs( dEnH), abs( dStH), false) ; } else if ( dStH < 0) { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, 0, abs( dStH), false) ; - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, 0, abs( dEnH), false) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, 0, abs( dStH), false) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, 0, abs( dEnH), false) ; } else { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, abs( dStH), abs( dEnH), false) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, abs( dStH), abs( dEnH), false) ; } } } @@ -1979,27 +1979,27 @@ VolZmap::GenTool_ZMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, co // Tagliente esterno if ( dEnH < dStH) { if ( dEnH > 0) { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, dEnH, dStH, true) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, dEnH, dStH, true) ; } else if ( dStH > 0) { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, 0, dStH, true) ; - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, 0, dEnH, true) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, 0, dStH, true) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, 0, dEnH, true) ; } else { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, dEnH, dStH, true) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, dEnH, dStH, true) ; } } // Tagliente interno else { if ( dEnH < 0) { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, abs( dEnH), abs( dStH), false) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, abs( dEnH), abs( dStH), false) ; } else if ( dStH < 0) { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, 0, abs( dStH), false) ; - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, 0, abs( dEnH), false) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, 0, abs( dStH), false) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, 0, abs( dEnH), false) ; } else { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, abs( dStH), abs( dEnH), false) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, abs( dStH), abs( dEnH), false) ; } } } @@ -3308,27 +3308,27 @@ VolZmap::GenTool_Drilling( int nGrid, const Point3d& ptS, const Point3d& ptE, co // Tagliente esterno if ( dEnH < dStH) { if ( dEnH > 0) { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, dEnH, dStH, true) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, dEnH, dStH, true) ; } else if ( dStH > 0) { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, 0, dStH, true) ; - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, 0, dEnH, true) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, 0, dStH, true) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, 0, dEnH, true) ; } else { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, dEnH, dStH, true) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, dEnH, dStH, true) ; } } // Tagliente interno else { if ( dEnH < 0) { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, abs( dEnH), abs( dStH), false) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, abs( dEnH), abs( dStH), false) ; } else if ( dStH < 0) { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, 0, abs( dStH), false) ; - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, 0, abs( dEnH), false) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, 0, abs( dStH), false) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, 0, abs( dEnH), false) ; } else { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, abs( dStH), abs( dEnH), false) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, abs( dStH), abs( dEnH), false) ; } } } @@ -3491,27 +3491,27 @@ VolZmap::GenTool_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE, con // Tagliente esterno if ( dEnH < dStH) { if ( dEnH > 0) { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, dEnH, dStH, true) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, dEnH, dStH, true) ; } else if ( dStH > 0) { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, 0, dStH, true) ; - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, 0, dEnH, true) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, 0, dStH, true) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, 0, dEnH, true) ; } else { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, dEnH, dStH, true) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, dEnH, dStH, true) ; } } // Tagliente interno else { if ( dEnH < 0) { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, abs( dEnH), abs( dStH), false) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, abs( dEnH), abs( dStH), false) ; } else if ( dStH < 0) { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, 0, abs( dStH), false) ; - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, 0, abs( dEnH), false) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, vtToolDir, dRadius, 0, abs( dStH), false) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, 0, abs( dEnH), false) ; } else { - SurfSpherePart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, abs( dStH), abs( dEnH), false) ; + SurfSphericalShellPart_Milling( nGrid, ptCenS, ptCenE, - vtToolDir, dRadius, abs( dStH), abs( dEnH), false) ; } } } @@ -6524,12 +6524,16 @@ VolZmap::SurfConus_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE, c return true ; } -// Parte di sfera +// Parte di calotta sferica //---------------------------------------------------------------------------- bool -VolZmap::SurfSpherePart_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx, +VolZmap::SurfSphericalShellPart_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx, double dRad, double dInfH, double dSupH, bool bOuterCutter) { + // Se la superficie è una calotta sferica, chiamo la routine apposita. + if ( dInfH > dRad - EPS_SMALL) + return SurfSphericalShell_Milling( nGrid, ptS, ptE, vtAx, dRad, dSupH, bOuterCutter) ; + // Verifico interferisca int nStartI, nStartJ, nEndI, nEndJ ; if ( ! TestCompoBBox( nGrid, ptS, ptS, V_NULL, dRad, 0, 0, nStartI, nStartJ, nEndI, nEndJ)) @@ -6565,7 +6569,7 @@ VolZmap::SurfSpherePart_Milling( int nGrid, const Point3d& ptS, const Point3d& p vSphereCutPlanesVecEn.emplace_back() ; vSphereCutPlanesVecEn.back().Set( ptE - dInfH * vtAx, - vtAx) ; - if ( abs( dAxDispDot) >= dCosSup) { + if ( abs( dAxDispDot) > dCosSup - EPS_ZERO) { if ( bOuterCutter == dAxDispDot > 0) return true ; @@ -6922,6 +6926,230 @@ VolZmap::SurfSpherePart_Milling( int nGrid, const Point3d& ptS, const Point3d& p return true ; } +// Calotta sferica +//---------------------------------------------------------------------------- +bool +VolZmap::SurfSphericalShell_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx, + double dRad, double dHei, bool bOuterCutter) +{ + // Verifico interferisca + int nStartI, nStartJ, nEndI, nEndJ ; + if ( ! TestCompoBBox( nGrid, ptS, ptS, V_NULL, dRad, 0, 0, nStartI, nStartJ, nEndI, nEndJ)) + return true ; + + // Vettore spostamento + Vector3d vtDisp = ptE - ptS ; + Vector3d vtDispVers = vtDisp ; + double dDispLen = vtDispVers.Len() ; + vtDispVers /= dDispLen ; + + // Prodotto scalare fra versore del movimento e asse della calotta sferica + double dAxDispDot = vtDispVers * vtAx ; + + // Raggio del cilindro ellittico + double dBaseRad = sqrt( max( dRad * dRad - dHei * dHei, 0.)) ; + + // Coseni limite + double dCosLim = dBaseRad / dRad ; + + // Vettore dei piani di taglio della sfera in posizione iniziale + vector vSphereCutPlanesVecSt ; + vSphereCutPlanesVecSt.emplace_back() ; + vSphereCutPlanesVecSt.back().Set( ptS - dHei * vtAx, vtAx) ; + // Vettore dei piani di taglio della sfera in posizione finale + vector vSphereCutPlanesVecEn ; + vSphereCutPlanesVecEn.emplace_back() ; + vSphereCutPlanesVecEn.back().Set( ptE - dHei * vtAx, vtAx) ; + + if ( abs( dAxDispDot) > dCosLim - EPS_ZERO) { + + if ( bOuterCutter == dAxDispDot > 0) + return true ; + + // Vettore dei piani di taglio del cilindro ellittico + vector vEllipCylCutPlanesVec ; + + // Ciclo sui punti + for ( int i = nStartI ; i <= nEndI ; ++ i) { + for ( int j = nStartJ ; j <= nEndJ; ++ j) { + + Point3d ptC( ( i + 0.5) * m_dStep, ( j + 0.5) * m_dStep, 0) ; + + vector> vParAndNormIntersVec ; + Point3d ptInt1, ptInt2 ; + Vector3d vtN1, vtN2 ; + + // Intersezione con sfera in posizione iniziale + int nIntNum = IntersLineSphereCuttedByPlanes( ptC, Z_AX, ptS, dRad, ! bOuterCutter, vSphereCutPlanesVecSt, + ptInt1, vtN1, ptInt2, vtN2) ; + if ( nIntNum >= 1) { + vParAndNormIntersVec.emplace_back() ; + vParAndNormIntersVec.back().first = ptInt1.z ; + vParAndNormIntersVec.back().second = vtN1 ; + if ( nIntNum == 2) { + vParAndNormIntersVec.emplace_back() ; + vParAndNormIntersVec.back().first = ptInt2.z ; + vParAndNormIntersVec.back().second = vtN2 ; + } + } + + // Intersezione con sfera in posizione finale + nIntNum = IntersLineSphereCuttedByPlanes( ptC, Z_AX, ptE, dRad, ! bOuterCutter, vSphereCutPlanesVecEn, + ptInt1, vtN1, ptInt2, vtN2) ; + if ( nIntNum >= 1) { + vParAndNormIntersVec.emplace_back() ; + vParAndNormIntersVec.back().first = ptInt1.z ; + vParAndNormIntersVec.back().second = vtN1 ; + if ( nIntNum == 2) { + vParAndNormIntersVec.emplace_back() ; + vParAndNormIntersVec.back().first = ptInt2.z ; + vParAndNormIntersVec.back().second = vtN2 ; + } + } + + // Intersezione con cilindro ellittico superiore + nIntNum = IntersLineCircSweptSurfCuttedByPlanes( ptC, Z_AX, ptS - dHei * vtAx, vtAx, dBaseRad, vtDisp, false, + vEllipCylCutPlanesVec, ptInt1, vtN1, ptInt2, vtN2) ; + if ( nIntNum >= 1) { + vParAndNormIntersVec.emplace_back() ; + vParAndNormIntersVec.back().first = ptInt1.z ; + vParAndNormIntersVec.back().second = vtN1 ; + if ( nIntNum == 2) { + vParAndNormIntersVec.emplace_back() ; + vParAndNormIntersVec.back().first = ptInt2.z ; + vParAndNormIntersVec.back().second = vtN2 ; + } + } + + // Riordino le intersezioni in funzione del parametro lungo la retta in corrispondenza del quale occorrono. + sort( vParAndNormIntersVec.begin(), vParAndNormIntersVec.end(), [] ( pair Int1, pair Int2) + { return Int1.first < Int2.first ; }) ; + + // Sottraggo gli intervalli + double dMyEps = EPS_ZERO ; + for ( int nI = 0 ; nI < int( vParAndNormIntersVec.size()) - 1 ; ++ nI) { + if ( vParAndNormIntersVec[nI].second.z < - dMyEps && vParAndNormIntersVec[nI+1].second.z > dMyEps) { + SubtractIntervals( nGrid, i, j, vParAndNormIntersVec[nI].first, vParAndNormIntersVec[nI+1].first, + vParAndNormIntersVec[nI].second, vParAndNormIntersVec[nI+1].second) ; + } + } + } + } + } + else { + + // Aggiorno il vettore dei piani di taglio della sfera in posizione iniziale. + vSphereCutPlanesVecSt.emplace_back() ; + vSphereCutPlanesVecSt.back().Set( ptS, bOuterCutter ? - vtDispVers : vtDispVers) ; + // Aggiorno il vettore dei piani di taglio della sfera in posizione finale. + vSphereCutPlanesVecEn.emplace_back() ; + vSphereCutPlanesVecEn.back().Set( ptE, bOuterCutter ? - vtDispVers : vtDispVers) ; + + // Versore della componente del moto perpendicolare all'asse + Vector3d vtOrtDispVers = vtDisp - dAxDispDot * vtAx ; + double dOrtDispLen = vtOrtDispVers.Len() ; + vtOrtDispVers /= dOrtDispLen ; + + // Vettore dei piani di taglio del cilindro ellittico superiore + Vector3d vtPlaneN = - dAxDispDot * vtOrtDispVers + dOrtDispLen * vtAx ; + if ( bOuterCutter != dAxDispDot > 0) + vtPlaneN *= - 1 ; + double dC = vtDispVers * vtAx ; + double dS = sqrt( max( 1 - dC * dC, 0.)) ; + Point3d ptPlaneP = ptS - dHei * vtAx + ( dC * dHei / dS) * vtOrtDispVers ; + vector vEllipCylCutPlanesVec ; + vEllipCylCutPlanesVec.emplace_back() ; + vEllipCylCutPlanesVec.back().Set( ptPlaneP, vtPlaneN) ; + + // Vettore dei piani di taglio del cilindro + vector vCylCutPlanesVec ; + vCylCutPlanesVec.emplace_back() ; + vCylCutPlanesVec.back().Set( ptPlaneP, bOuterCutter == dAxDispDot > 0 ? vtPlaneN : - vtPlaneN) ; + + // Ciclo sui punti + for ( int i = nStartI ; i <= nEndI ; ++ i) { + for ( int j = nStartJ ; j <= nEndJ ; ++ j) { + + Point3d ptC( ( i + 0.5) * m_dStep, ( j + 0.5) * m_dStep, 0) ; + + vector> vParAndNormIntersVec ; + Point3d ptInt1, ptInt2 ; + Vector3d vtN1, vtN2 ; + + // Intersezione con sfera in posizione iniziale + int nIntNum = IntersLineSphereCuttedByPlanes( ptC, Z_AX, ptS, dRad, ! bOuterCutter, vSphereCutPlanesVecSt, + ptInt1, vtN1, ptInt2, vtN2) ; + if ( nIntNum >= 1) { + vParAndNormIntersVec.emplace_back() ; + vParAndNormIntersVec.back().first = ptInt1.z ; + vParAndNormIntersVec.back().second = vtN1 ; + if ( nIntNum == 2) { + vParAndNormIntersVec.emplace_back() ; + vParAndNormIntersVec.back().first = ptInt2.z ; + vParAndNormIntersVec.back().second = vtN2 ; + } + } + + // Intersezione con sfera in posizione finale + nIntNum = IntersLineSphereCuttedByPlanes( ptC, Z_AX, ptE, dRad, ! bOuterCutter, vSphereCutPlanesVecEn, + ptInt1, vtN1, ptInt2, vtN2) ; + if ( nIntNum >= 1) { + vParAndNormIntersVec.emplace_back() ; + vParAndNormIntersVec.back().first = ptInt1.z ; + vParAndNormIntersVec.back().second = vtN1 ; + if ( nIntNum == 2) { + vParAndNormIntersVec.emplace_back() ; + vParAndNormIntersVec.back().first = ptInt2.z ; + vParAndNormIntersVec.back().second = vtN2 ; + } + } + + // Intersezione con cilindro ellittico + nIntNum = IntersLineCircSweptSurfCuttedByPlanes( ptC, Z_AX, ptS - dHei * vtAx, vtAx, dBaseRad, vtDisp, bOuterCutter == dAxDispDot > 0, + vEllipCylCutPlanesVec, ptInt1, vtN1, ptInt2, vtN2) ; + if ( nIntNum >= 1) { + vParAndNormIntersVec.emplace_back() ; + vParAndNormIntersVec.back().first = ptInt1.z ; + vParAndNormIntersVec.back().second = vtN1 ; + if ( nIntNum == 2) { + vParAndNormIntersVec.emplace_back() ; + vParAndNormIntersVec.back().first = ptInt2.z ; + vParAndNormIntersVec.back().second = vtN2 ; + } + } + + // Intersezione con cilindro esterno + nIntNum = IntersLineCylinderCuttedByPlanes( ptC, Z_AX, ptE, - vtDispVers, dRad, dDispLen, false, + vCylCutPlanesVec, ptInt1, vtN1, ptInt2, vtN2) ; + if ( nIntNum >= 1) { + vParAndNormIntersVec.emplace_back() ; + vParAndNormIntersVec.back().first = ptInt1.z ; + vParAndNormIntersVec.back().second = vtN1 ; + if ( nIntNum == 2) { + vParAndNormIntersVec.emplace_back() ; + vParAndNormIntersVec.back().first = ptInt2.z ; + vParAndNormIntersVec.back().second = vtN2 ; + } + } + + // Riordino le intersezioni in funzione del parametro lungo la retta in corrispondenza del quale occorrono. + sort( vParAndNormIntersVec.begin(), vParAndNormIntersVec.end(), [] ( pair Int1, pair Int2) + { return Int1.first < Int2.first ; }) ; + + // Sottraggo gli intervalli + double dMyEps = EPS_ZERO ; + for ( int nI = 0 ; nI < int( vParAndNormIntersVec.size()) - 1 ; ++ nI) { + if ( vParAndNormIntersVec[nI].second.z < - dMyEps && vParAndNormIntersVec[nI+1].second.z > dMyEps) { + SubtractIntervals( nGrid, i, j, vParAndNormIntersVec[nI].first, vParAndNormIntersVec[nI+1].first, + vParAndNormIntersVec[nI].second, vParAndNormIntersVec[nI+1].second) ; + } + } + } + } + } + + return true ; +} // ------------------------- BOUNDING BOX --------------------------------------------------------------------------------------