diff --git a/VolZmapCalculus.cpp b/VolZmapCalculus.cpp index 52d304f..2305dfc 100644 --- a/VolZmapCalculus.cpp +++ b/VolZmapCalculus.cpp @@ -1169,25 +1169,42 @@ VolZmap::IntersLineMyPolyhedron( const Point3d& ptLineSt, const Vector3d& vtLine const Frame3d& PolyFrame, double dLenX, double dLenY, double dLenZ, double dDeltaZ, Point3d& ptInt1, Point3d& ptInt2, Vector3d& vtN1, Vector3d& vtN2) { + // Costanti degli Offset + const double dOffsetX = EPS_SMALL ; + const double dOffsetY = EPS_SMALL ; + const double dOffsetZ = EPS_SMALL * sqrt( 1 + ( dDeltaZ * dDeltaZ) / ( dLenX * dLenX)) ; + + // Controllo sulle dimensioni lineari affinché sia valido l'offset + if ( dLenX <= 2 * dOffsetX || dLenY <= 2 * dOffsetY || dLenZ <= 2 * dOffsetZ) + return false ; + + // Accorcio le dimensioni lineari in modo opportuno: si noti che ora dLenX > 0 e ( 1 - 2 * EPS_SMALL / dLenX) < 1 + dLenX -= 2 * dOffsetX ; + dLenY -= 2 * dOffsetY ; + dLenZ -= 2 * dOffsetZ ; + dDeltaZ = dDeltaZ * ( 1 - ( 2 * EPS_SMALL) / dLenX) ; + // Riferimento del poliedro offsettato + Frame3d frInnerFrame = PolyFrame ; + frInnerFrame.Translate( dOffsetX * frInnerFrame.VersX() + dOffsetZ * frInnerFrame.VersZ()) ; + Point3d ptP = ptLineSt ; Vector3d vtV = vtLineDir ; // Trasformazione delle coordinate - ptP.ToLoc( PolyFrame) ; - vtV.ToLoc( PolyFrame) ; + ptP.ToLoc( frInnerFrame) ; + vtV.ToLoc( frInnerFrame) ; // Facce 1 e 2 parallele a XY // Facce 3 e 4 parallele a XZ // Facce 5 e 6 oblique Point3d ptFacet135( 0, dLenY / 2, 0) ; - Point3d ptFacet246( dLenX , - dLenY / 2, dLenZ + dDeltaZ) ; + Point3d ptFacet246( dLenX, - dLenY / 2, dLenZ + dDeltaZ) ; // Servono per descrivere i piani obliqui Vector3d vtFacet5 = ptFacet135 - ptP ; Vector3d vtFacet6 = ptFacet246 - ptP ; Vector3d vtOb( - dDeltaZ, 0, dLenX) ; - vtOb.Normalize() ; Point3d ptI1 = ptP + ( ( ptFacet135.y - ptP.y) / vtV.y) * vtV ; @@ -1200,29 +1217,18 @@ VolZmap::IntersLineMyPolyhedron( const Point3d& ptLineSt, const Vector3d& vtLine // Controlli affinché non vengano tagliati dexel a filo // con il passaggio dell'utensile: // Controllo sulle facce 1 e 2 - if ( abs( vtV.y) < EPS_ZERO && - abs( ptP.y) > dLenY / 2 - EPS_SMALL) + if ( abs( vtV.y) < EPS_ZERO && abs( ptP.y) > ptFacet135.y) return false ; // Controllo sulle facce 3 e 4 - if ( abs( vtV.x) < EPS_ZERO && - ( ptP.x < EPS_SMALL || - ptP.x > dLenX - EPS_SMALL)) + if ( abs( vtV.x) < EPS_ZERO && ( ptP.x < ptFacet135.x || ptP.x > ptFacet246.x)) return false ; // Controllo sulle facce 5 e 6 - /*Vector3d vtW( 0, dLenX, dDeltaZ) ; - vtW.Normalize() ; - Vector3d vtU = vtV - vtV.y * Y_AX - vtV * vtW * vtW ; - if ( vtU.Len() < EPS_ZERO && - ( ptP.z * dLenX < dDeltaZ * ptP.x + dLenX * EPS_SMALL || - ptP.z * dLenX > dDeltaZ * ptP.x + dLenX * ( dLenY - EPS_SMALL))) - return false ;*/ double dDotObV = abs( vtV * vtOb) ; Vector3d vtP1 = ptFacet135 - ptP ; Vector3d vtP2 = ptFacet246 - ptP ; double dP1 = abs ( vtP1 * vtOb) ; double dP2 = abs ( vtP2 * vtOb) ; - if ( dDotObV < EPS_ZERO && - ( dP1 < EPS_SMALL || dP2 < EPS_SMALL)) + if ( dDotObV < EPS_ZERO && ( dP1 < EPS_SMALL || dP2 < EPS_SMALL)) return false ; // Ricerca intersezioni con le facce @@ -1231,7 +1237,6 @@ VolZmap::IntersLineMyPolyhedron( const Point3d& ptLineSt, const Vector3d& vtLine // Intersezione con la prima faccia if ( ptI1.x >= 0 && ptI1.x <= dLenX && ptI1.z * dLenX >= dDeltaZ * ptI1.x && ( ptI1.z - dLenZ) * dLenX <= dDeltaZ * ptI1.x) { - ptInt1 = ptI1 ; vtN1 = - Y_AX ; ++ nIntNum ; @@ -1317,10 +1322,10 @@ VolZmap::IntersLineMyPolyhedron( const Point3d& ptLineSt, const Vector3d& vtLine } if ( nIntNum == 2) { - ptInt1.ToGlob( PolyFrame) ; - ptInt2.ToGlob( PolyFrame) ; - vtN1.ToGlob( PolyFrame) ; - vtN2.ToGlob( PolyFrame) ; + ptInt1.ToGlob( frInnerFrame) ; + ptInt2.ToGlob( frInnerFrame) ; + vtN1.ToGlob( frInnerFrame) ; + vtN2.ToGlob( frInnerFrame) ; return true ; } else diff --git a/VolZmapVolume.cpp b/VolZmapVolume.cpp index 66f2145..4f0ad33 100644 --- a/VolZmapVolume.cpp +++ b/VolZmapVolume.cpp @@ -1647,7 +1647,7 @@ VolZmap::Mrt_ZDrilling( unsigned int nGrid, const Point3d& ptS, const Point3d& p double dLenZ = m_Tool.GetHeigth() - m_Tool.GetCornRadius() ; CompPar_ZDrilling( nGrid, dLenX, dLenY, dLenZ, ptS, ptEOnP, vtToolDir, vtAux) ; - + // Se la punta è di tipo bull-nose if ( abs( m_Tool.GetMrtChsWidth() - 2 * m_Tool.GetCornRadius()) > EPS_SMALL) { @@ -2869,7 +2869,7 @@ VolZmap::Mrt_Drilling( unsigned int nGrid, const Point3d& ptS, const Point3d& pt double dLenY = m_Tool.GetMrtChsThickness() ; double dLenZ = m_Tool.GetHeigth() - m_Tool.GetCornRadius() ; CompPar_Drilling( nGrid, dLenX, dLenY, dLenZ, ptS, ptEOnP, vtToolDir, vtAux) ; - + // Se la punta è di tipo bull-nose if ( abs( m_Tool.GetMrtChsWidth() - 2 * m_Tool.GetCornRadius()) > EPS_SMALL) { @@ -3820,7 +3820,7 @@ VolZmap::CompPar_ZMilling( unsigned int nGrid, double dLenX, double dLenY, doubl for ( unsigned int i = nStartI ; i <= nEndI ; ++ i) { for ( unsigned int j = nStartJ ; j <= nEndJ ; ++ j) { - + double dX = ( i + 0.5) * m_dStep ; double dY = ( j + 0.5) * m_dStep ; @@ -4016,7 +4016,7 @@ VolZmap::CompPar_Drilling( unsigned int nGrid, double dLenX, double dLenY, doubl for ( unsigned int i = nStartI ; i <= nEndI ; ++ i) { for ( unsigned int j = nStartJ ; j <= nEndJ ; ++ j) { - + double dX = ( i + 0.5) * m_dStep ; double dY = ( j + 0.5) * m_dStep ; @@ -4093,7 +4093,7 @@ VolZmap::CompCyl_Milling( unsigned int nGrid, const Point3d& ptS, const Point3d& for ( unsigned int i = nStartI ; i <= nEndI ; ++ i) { for ( unsigned int j = nStartJ ; j <= nEndJ ; ++ j) { - + Point3d ptC( ( i + 0.5) * m_dStep, ( j + 0.5) * m_dStep, 0) ; Point3d ptInt1, ptInt2 ; @@ -4642,7 +4642,7 @@ VolZmap::CompPar_Milling( unsigned int nGrid, double dLenX, double dLenY, double for ( unsigned int i = nStartI ; i <= nEndI ; ++ i) { for ( unsigned int j = nStartJ ; j <= nEndJ ; ++ j) { - + double dX = ( i + 0.5) * m_dStep ; double dY = ( j + 0.5) * m_dStep ; @@ -4692,7 +4692,6 @@ VolZmap::CompPar_Milling( unsigned int nGrid, double dLenX, double dLenY, double } // Volume spazzato nel moto - //if ( IntersLineMyPolyhedron( ptC, Z_AX, MotionFrame, dDimOrt, dLenZ, dDimLong, dDeltaLong, ptInt1, ptInt2, vtN1, vtN2)) { if ( IntersLineMyPolyhedron( ptC, Z_AX, MotionFrame, dLenW1, dLenZ, dLenW3, dDeltaW3, ptInt1, ptInt2, vtN1, vtN2)) { double dMin, dMax ; Vector3d vtNmin, vtNmax ;