Aggiunte nuove funzionalità Asportazioni volumi
This commit is contained in:
+263
-35
@@ -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<Plane3d> vSphereCutPlanesVecSt ;
|
||||
vSphereCutPlanesVecSt.emplace_back() ;
|
||||
vSphereCutPlanesVecSt.back().Set( ptS - dHei * vtAx, vtAx) ;
|
||||
// Vettore dei piani di taglio della sfera in posizione finale
|
||||
vector<Plane3d> 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<Plane3d> 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<pair<double, Vector3d>> 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<double, Vector3d> Int1, pair<double, Vector3d> 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<Plane3d> vEllipCylCutPlanesVec ;
|
||||
vEllipCylCutPlanesVec.emplace_back() ;
|
||||
vEllipCylCutPlanesVec.back().Set( ptPlaneP, vtPlaneN) ;
|
||||
|
||||
// Vettore dei piani di taglio del cilindro
|
||||
vector<Plane3d> 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<pair<double, Vector3d>> 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<double, Vector3d> Int1, pair<double, Vector3d> 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 --------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
Reference in New Issue
Block a user