Aggiunte nuove funzionalità Asportazioni volumi

This commit is contained in:
LorenzoM
2021-08-05 15:22:08 +02:00
parent d2cb613505
commit ade2d97804
2 changed files with 267 additions and 37 deletions
+263 -35
View File
@@ -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 --------------------------------------------------------------------------------------