diff --git a/VolZmapVolume.cpp b/VolZmapVolume.cpp index c45303a..66f2145 100644 --- a/VolZmapVolume.cpp +++ b/VolZmapVolume.cpp @@ -3785,65 +3785,38 @@ VolZmap::CompPar_ZMilling( unsigned int nGrid, double dLenX, double dLenY, doubl const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir, const Vector3d& vtAux) { - // uso funzione generica per verifica rapida - return CompPar_Milling( nGrid, dLenX, dLenY, dLenZ, ptS, ptE, vtToolDir, vtAux) ; - // Controllo sull'interferenza utensile-solido unsigned int nStartI, nStartJ, nEndI, nEndJ ; bool bInterf = BBoxParaComp( nGrid, dLenX, dLenY, dLenZ, ptS, ptE, vtToolDir, vtAux, nStartI, nStartJ, nEndI, nEndJ) ; if ( ! bInterf) return true ; - // Materiale asportato nelle posizioni iniziale e finale - - // Costruisco un sistema di riferimento nel piano - Point3d ptSXY( ptS.x, ptS.y, 0) ; - Point3d ptEXY( ptE.x, ptE.y, 0) ; - Vector3d vtV1 = vtToolDir ^ vtAux ; - Vector3d vtV2 = vtAux ; - - if ( vtV1 * ( ptE - ptS) < 0) - vtV1 *= - 1 ; - - double dLenMove = ( ( ( ptE - ptS) * vtV1) * vtV1).Len() ; - - // Quote estreme del volume asportato + // Quote estreme Z double dMinZ = min( min( ptS.z, ptS.z - vtToolDir.z * dLenZ), min( ptE.z, ptE.z - vtToolDir.z * dLenZ)) ; double dMaxZ = max( max( ptS.z, ptS.z - vtToolDir.z * dLenZ), max( ptE.z, ptE.z - vtToolDir.z * dLenZ)) ; + // Vettore di movimento + Vector3d vtMove = ptE - ptS ; + + // Sistemi di riferimento del solido nella posizione iniziale e finale + Vector3d vtV2 = vtAux ; + Vector3d vtV1 = vtV2 ^ vtToolDir ; + vtV1.Normalize() ; + Point3d ptSXY( ptS.x, ptS.y, 0) ; + Point3d ptEXY( ptE.x, ptE.y, 0) ; + // Studio del volume asportato durante il moto - - // Studio delle simmetrie - - Point3d ptLs = ( ( ptE - ptS) * vtAux > 0 ? ptS : ptE) ; - Point3d ptLe = ( ( ptE - ptS) * vtAux > 0 ? ptE : ptS) ; - - Vector3d vtMove = ptLe - ptLs ; - - Vector3d vtW3 = vtAux ; - Vector3d vtAnsatz = ( vtW3 ^ vtToolDir) ; - - bool bSymmetry = vtMove * ( vtW3 ^ vtToolDir) > 0 ; - - Vector3d vtW2 = ( bSymmetry ? vtAnsatz : - vtAnsatz) ; - Vector3d vtW1 = ( bSymmetry ? vtToolDir : - vtToolDir) ; - - - Point3d ptDiagMin = ptLs - vtW2 * ( 0.5 * dLenX) + vtW3 * ( 0.5 * dLenY) ; - Point3d ptDiagMax = ptLs + vtW2 * ( 0.5 * dLenX) - vtW3 * ( 0.5 * dLenY) ; - - Vector3d vtU1 = ptDiagMax - ptDiagMin ; vtU1.Normalize() ; - Vector3d vtU2 = ( vtU1 * vtMove > 0 ? vtMove - vtMove * vtU1 * vtU1 : - vtMove * vtU1 * vtU1 - vtMove) ; - vtU2.Normalize() ; - - Point3d ptOMot = ( vtMove * vtU1 > 0 ? ptDiagMin : ptDiagMin + vtMove) ; - - Point3d ptOMotXY( ptOMot.x, ptOMot.y, 0) ; - - double dLen1 = vtMove * vtU1 ; - double dLen2 = vtMove * vtU2 ; - double dHx = ( ptDiagMax - ptDiagMin).Len() ; + Frame3d MotionFrame ; + Vector3d vtDiagA = dLenX * vtV1 + dLenY * vtV2 ; + Vector3d vtDiagB = dLenX * vtV1 - dLenY * vtV2 ; + Vector3d vtW1 = ( abs( vtDiagA * vtMove) <= abs( vtDiagB * vtMove) ? vtDiagA : vtDiagB) ; + Point3d ptOrigXY = ptSXY - vtW1 / 2 ; + double dLenW1 = vtW1.Len() ; + vtW1 /= dLenW1 ; + double dDeltaW1 = vtMove * vtW1 ; + Vector3d vtW2 = vtMove - dDeltaW1 * vtW1 ; + double dLenW2 = vtW2.Len() ; + vtW2 /= dLenW2 ; for ( unsigned int i = nStartI ; i <= nEndI ; ++ i) { for ( unsigned int j = nStartJ ; j <= nEndJ ; ++ j) { @@ -3872,12 +3845,12 @@ VolZmap::CompPar_ZMilling( unsigned int nGrid, double dLenX, double dLenY, doubl SubtractIntervals( nGrid, i, j, dMinZ, dMaxZ, Z_AX, - Z_AX) ; // Asportazione materiale nel moto - Vector3d vtR = ptC - ptOMotXY ; - double dR1 = vtR * vtU1 ; - double dR2 = vtR * vtU2 ; - if ( dR2 > EPS_SMALL && dR2 < dLen2 - EPS_SMALL && - dR1 * dLen2 > dLen1 * dR2 + EPS_SMALL && - dR1 * dLen2 < dHx * dLen2 + dLen1 * dR2 - EPS_SMALL) + Vector3d vtR = ptC - ptOrigXY ; + double dR1 = vtR * vtW1 ; + double dR2 = vtR * vtW2 ; + if ( dR2 > EPS_SMALL && dR2 < dLenW2 - EPS_SMALL && + dR1 * dLenW2 > /*dLenW1*/dDeltaW1 * dR2 + EPS_SMALL && + dR1 * dLenW2 < /*dDeltaW1*/dLenW1 * dLenW2 + /*dLenW1*/ dDeltaW1 * dR2 - EPS_SMALL) SubtractIntervals( nGrid, i, j, dMinZ, dMaxZ, Z_AX, - Z_AX) ; } }