diff --git a/Tool.cpp b/Tool.cpp index fcd3acf..81e3d76 100644 --- a/Tool.cpp +++ b/Tool.cpp @@ -689,11 +689,11 @@ Tool::SetAdditiveTool( const std::string& sToolName, double dH, double dR, doubl m_dRefRadius = 0 ; m_dCutterHeight = dH ; - double dThreshold = m_dRCorner * m_dRCorner - 0.25 * m_dHeight * m_dHeight ; - // Utensile cilindrico - if ( dThreshold > 0) { + double dSquareCornerRadProj = m_dRCorner * m_dRCorner - 0.25 * m_dHeight * m_dHeight ; + // Utensile sfiancato + if ( dSquareCornerRadProj > 0) { double dCenX = m_dRadius - m_dRCorner ; - double dCylRad = dCenX + sqrt( dThreshold) ; + double dCylRad = dCenX + sqrt( dSquareCornerRadProj) ; // Utensile mal definito if ( dCylRad < 0) return false ; @@ -709,26 +709,39 @@ Tool::SetAdditiveTool( const std::string& sToolName, double dH, double dR, doubl m_Outline.SetCurveTempProp( 2, 1, 1) ; m_Outline.SetTempProp( 1, 1) ; } - // Utensile sfiancato + // Utensile cilindrico con eventuale raggio corner else { // Utensile mal definito if ( m_dRadius - m_dRCorner < EPS_SMALL) return false ; - // Profilo - m_Outline.AddPoint( Point3d( 0, 0, 0)) ; - m_Outline.AddLine( Point3d( m_dRadius - m_dRCorner, 0, 0)) ; - m_Outline.SetCurveTempProp( 0, 1, 1) ; - CurveArc cvArc ; - cvArc.SetC2P( Point3d( m_dRadius - m_dRCorner, - m_dRCorner, 0), Point3d( m_dRadius - m_dRCorner, 0, 0), Point3d( m_dRadius, - m_dRCorner, 0)) ; - m_Outline.SetCurveTempProp( 1, 1, 1) ; - m_Outline.AddLine( Point3d( m_dRadius, - m_dHeight + m_dRCorner, 0)) ; - m_Outline.SetCurveTempProp( 2, 1, 1) ; - cvArc.SetC2P( Point3d( m_dRadius - m_dRCorner, - m_dHeight + m_dRCorner, 0), Point3d( m_dRadius, - m_dHeight + m_dRCorner, 0), Point3d( m_dRadius - m_dRCorner, - m_dHeight, 0)) ; - m_Outline.AddCurve( cvArc) ; - m_Outline.SetCurveTempProp( 3, 1, 1) ; - m_Outline.AddLine( Point3d( 0, - m_dHeight, 0)) ; - m_Outline.SetCurveTempProp( 4, 1, 1) ; - m_Outline.SetTempProp( 1, 1) ; + // Raggio corner nullo + if ( m_dRadius < EPS_SMALL) { + // Profilo + m_Outline.AddPoint( Point3d( 0, 0, 0)) ; + m_Outline.AddLine( Point3d( m_dRadius, 0, 0)) ; + m_Outline.SetCurveTempProp( 0, 1, 1) ; + m_Outline.AddLine( Point3d( m_dRadius, - m_dHeight, 0)) ; + m_Outline.SetCurveTempProp( 1, 1, 1) ; + m_Outline.AddLine( Point3d( 0, - m_dHeight, 0)) ; + m_Outline.SetCurveTempProp( 2, 1, 1) ; + } + else { + // Profilo + m_Outline.AddPoint( Point3d( 0, 0, 0)) ; + m_Outline.AddLine( Point3d( m_dRadius - m_dRCorner, 0, 0)) ; + m_Outline.SetCurveTempProp( 0, 1, 1) ; + CurveArc cvArc ; + cvArc.SetC2P( Point3d( m_dRadius - m_dRCorner, - m_dRCorner, 0), Point3d( m_dRadius - m_dRCorner, 0, 0), Point3d( m_dRadius, - m_dRCorner, 0)) ; + m_Outline.SetCurveTempProp( 1, 1, 1) ; + m_Outline.AddLine( Point3d( m_dRadius, - m_dHeight + m_dRCorner, 0)) ; + m_Outline.SetCurveTempProp( 2, 1, 1) ; + cvArc.SetC2P( Point3d( m_dRadius - m_dRCorner, - m_dHeight + m_dRCorner, 0), Point3d( m_dRadius, - m_dHeight + m_dRCorner, 0), Point3d( m_dRadius - m_dRCorner, - m_dHeight, 0)) ; + m_Outline.AddCurve( cvArc) ; + m_Outline.SetCurveTempProp( 3, 1, 1) ; + m_Outline.AddLine( Point3d( 0, - m_dHeight, 0)) ; + m_Outline.SetCurveTempProp( 4, 1, 1) ; + m_Outline.SetTempProp( 1, 1) ; + } } return SetGenTool( sToolName, &m_Outline, nToolNum) ; diff --git a/VolZmap.h b/VolZmap.h index cf7df88..d6499bc 100644 --- a/VolZmap.h +++ b/VolZmap.h @@ -338,7 +338,7 @@ class VolZmap : public IVolZmap, public IGeoObjRW bool SurfSphericalShell_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx, double dRad, double dHei, bool bOuterCutter) ; // Additivo - bool AddingMotion( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx, double dHei, double dRad, double dCornerRad) ; + bool AddingMotion( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx/*, double dHei, double dRad, double dCornerRad*/) ; // Intersezioni diff --git a/VolZmapVolume.cpp b/VolZmapVolume.cpp index 7de64b1..450143f 100644 --- a/VolZmapVolume.cpp +++ b/VolZmapVolume.cpp @@ -263,18 +263,22 @@ VolZmap::AddIntervals( int nGrid, int nI, int nJ, if ( nGrid < 0 || nGrid > 2) return false ; - // Controllo che dMin < dMax - if ( dMin > dMax) - swap( dMin, dMax) ; - // Controllo che indici nI, nJ siano entro i limiti if ( nI < 0 && nI >= m_nNx[nGrid] && nJ < 0 && nJ >= m_nNy[nGrid]) return false ; - // Riporto le coordinate cicliche nell'ordine di partenza + // Controllo che dMin < dMax Vector3d vtNmi = vtNMin ; Vector3d vtNma = vtNMax ; + if ( dMin > dMax) { + swap( dMin, dMax) ; + swap( vtNmi, vtNma) ; + } + + // Riporto le coordinate cicliche nell'ordine di partenza + /*Vector3d vtNmi = vtNMin ; + Vector3d vtNma = vtNMax ;*/ if ( nGrid == 1) { swap( vtNmi.x, vtNmi.z) ; swap( vtNmi.y, vtNmi.z) ; @@ -5478,13 +5482,13 @@ VolZmap::IntersLineCircSweptSurfCuttedByPlanes( const Point3d& ptLineP, const Ve // Escludo le soluzioni che non stanno dalla parte ammissibile rispetto al piano. bool bSecIntToTest = nRoot > 1 ; for ( int n = 0 ; n < int( vPlanesVec.size()) && nRoot > 0 ; ++ n) { - double dDist1 = DistPointPlane(ptInt1, vPlanesVec[n]); + //double dDist1 = DistPointPlane(ptInt1, vPlanesVec[n]); if ( DistPointPlane( ptInt1, vPlanesVec[n]) > 0 + EPS_SMALL/*DistPointPlane( ptInt1, vPlanesVec[n]) >= 0*/) { ptInt1 = ptInt2 ; vtN1 = vtN2 ; -- nRoot ; } - double dDist2 = DistPointPlane(ptInt2, vPlanesVec[n]); + //double dDist2 = DistPointPlane(ptInt2, vPlanesVec[n]); if ( bSecIntToTest && nRoot > 0 && DistPointPlane( ptInt2, vPlanesVec[n]) > 0 + EPS_SMALL/*bSecIntToTest && nRoot > 0 && DistPointPlane( ptInt2, vPlanesVec[n]) >= 0*/) { bSecIntToTest = false ; -- nRoot ; @@ -6384,8 +6388,8 @@ VolZmap::SurfCyl_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE, vParAndNormIntersVec.back().second = vtN2 ; if ( vCutEllipCylPlaneVecUp.size() == 1) { if ( SqDist( ptInt1, ptInt2) < EPS_SMALL) { - double dLL1 = (ptInt1 - vCutEllipCylPlaneVecUp[0].GetPoint()) * vCutEllipCylPlaneVecUp[0].GetVersN(); - double dLL2 = (ptInt2 - vCutEllipCylPlaneVecUp[0].GetPoint()) * vCutEllipCylPlaneVecUp[0].GetVersN(); + //double dLL1 = (ptInt1 - vCutEllipCylPlaneVecUp[0].GetPoint()) * vCutEllipCylPlaneVecUp[0].GetVersN(); + //double dLL2 = (ptInt2 - vCutEllipCylPlaneVecUp[0].GetPoint()) * vCutEllipCylPlaneVecUp[0].GetVersN(); if ( ( ptInt1 - vCutEllipCylPlaneVecUp[0].GetPoint()) * vCutEllipCylPlaneVecUp[0].GetVersN() > 0.) vParAndNormIntersVec.erase( vParAndNormIntersVec.begin() + int( vParAndNormIntersVec.size()) - 2) ; else if ( ( ptInt2 - vCutEllipCylPlaneVecUp[0].GetPoint()) * vCutEllipCylPlaneVecUp[0].GetVersN() > 0.) @@ -6408,9 +6412,8 @@ VolZmap::SurfCyl_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE, vParAndNormIntersVec.back().second = vtN2 ; if ( vCutEllipCylPlaneVecDw.size() == 1) { if ( SqDist( ptInt1, ptInt2) < EPS_SMALL) { - int bazinga2 = 0 ; - double dLL1 = (ptInt1 - vCutEllipCylPlaneVecDw[0].GetPoint()) * vCutEllipCylPlaneVecDw[0].GetVersN(); - double dLL2 = (ptInt2 - vCutEllipCylPlaneVecDw[0].GetPoint()) * vCutEllipCylPlaneVecDw[0].GetVersN(); + //double dLL1 = (ptInt1 - vCutEllipCylPlaneVecDw[0].GetPoint()) * vCutEllipCylPlaneVecDw[0].GetVersN(); + //double dLL2 = (ptInt2 - vCutEllipCylPlaneVecDw[0].GetPoint()) * vCutEllipCylPlaneVecDw[0].GetVersN(); if ( ( ptInt1 - vCutEllipCylPlaneVecDw[0].GetPoint()) * vCutEllipCylPlaneVecDw[0].GetVersN() > 0.) vParAndNormIntersVec.erase( vParAndNormIntersVec.begin() + int( vParAndNormIntersVec.size()) - 2) ; else if ( ( ptInt2 - vCutEllipCylPlaneVecDw[0].GetPoint()) * vCutEllipCylPlaneVecDw[0].GetVersN() > 0.) @@ -7002,9 +7005,8 @@ VolZmap::SurfConus_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE, c vParAndNormIntersVec.back().second = vtN2 ; if ( vCutEllipCylPlaneVecUp.size() == 1) { if ( SqDist( ptInt1, ptInt2) < EPS_SMALL) { - int bazinga1 = 0 ; - double dLL1 = (ptInt1 - vCutEllipCylPlaneVecUp[0].GetPoint()) * vCutEllipCylPlaneVecUp[0].GetVersN(); - double dLL2 = (ptInt2 - vCutEllipCylPlaneVecUp[0].GetPoint()) * vCutEllipCylPlaneVecUp[0].GetVersN(); + //double dLL1 = (ptInt1 - vCutEllipCylPlaneVecUp[0].GetPoint()) * vCutEllipCylPlaneVecUp[0].GetVersN(); + //double dLL2 = (ptInt2 - vCutEllipCylPlaneVecUp[0].GetPoint()) * vCutEllipCylPlaneVecUp[0].GetVersN(); if ( ( ptInt1 - vCutEllipCylPlaneVecUp[0].GetPoint()) * vCutEllipCylPlaneVecUp[0].GetVersN() > 0.) vParAndNormIntersVec.erase( vParAndNormIntersVec.begin() + int( vParAndNormIntersVec.size()) - 2) ; else if ( ( ptInt2 - vCutEllipCylPlaneVecUp[0].GetPoint()) * vCutEllipCylPlaneVecUp[0].GetVersN() > 0.) @@ -7027,9 +7029,8 @@ VolZmap::SurfConus_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE, c vParAndNormIntersVec.back().second = vtN2 ; if ( vCutEllipCylPlaneVecDw.size() == 1) { if ( SqDist( ptInt1, ptInt2) < EPS_SMALL) { - int bazinga2 = 0 ; - double dLL1 = (ptInt1 - vCutEllipCylPlaneVecDw[0].GetPoint()) * vCutEllipCylPlaneVecDw[0].GetVersN(); - double dLL2 = (ptInt2 - vCutEllipCylPlaneVecDw[0].GetPoint()) * vCutEllipCylPlaneVecDw[0].GetVersN(); + //double dLL1 = (ptInt1 - vCutEllipCylPlaneVecDw[0].GetPoint()) * vCutEllipCylPlaneVecDw[0].GetVersN(); + //double dLL2 = (ptInt2 - vCutEllipCylPlaneVecDw[0].GetPoint()) * vCutEllipCylPlaneVecDw[0].GetVersN(); if ( ( ptInt1 - vCutEllipCylPlaneVecDw[0].GetPoint()) * vCutEllipCylPlaneVecDw[0].GetVersN() > 0.) vParAndNormIntersVec.erase( vParAndNormIntersVec.begin() + int( vParAndNormIntersVec.size()) - 2) ; else if ( ( ptInt2 - vCutEllipCylPlaneVecDw[0].GetPoint()) * vCutEllipCylPlaneVecDw[0].GetVersN() > 0.) @@ -7680,7 +7681,6 @@ VolZmap::SurfSphericalShell_Milling( int nGrid, const Point3d& ptS, const Point3 vtPlaneN *= - 1 ; double dC = vtDispVers * vtAx ; double dS = sqrt( max( 1 - dC * dC, 0.)) ; - double dTempTest = (dC * dHei / dS); Point3d ptPlaneP = ptS - dHei * vtAx + ( dC * dHei / dS) * vtOrtDispVers ; vector vEllipCylCutPlanesVec ; vEllipCylCutPlanesVec.emplace_back() ; @@ -7792,101 +7792,171 @@ VolZmap::SurfSphericalShell_Milling( int nGrid, const Point3d& ptS, const Point3 //---------------------------------------------------------------------------- bool -VolZmap::AddingMotion( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx, double dHei, double dRad, double dCornerRad) +VolZmap::AddingMotion( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtAx/*, double dHei, double dRad, double dCornerRad*/) { + // Dimensioni lineari dell'utensile + double dHei = m_vTool[m_nCurrTool].GetHeigth() ; + double dRad = m_vTool[m_nCurrTool].GetRadius() ; + double dCornerRad = m_vTool[m_nCurrTool].GetCornRadius() ; + // Verifica sull'interferenza utensile Zmap int nStartI, nStartJ, nEndI, nEndJ ; if ( ! TestCompoBBox( nGrid, ptS, ptE, vtAx, dRad, dRad, dHei, nStartI, nStartJ, nEndI, nEndJ)) return true ; + + Vector3d vtV1 = ptE - ptS ; + double dLen1 = vtV1.Len() ; + vtV1 / dLen1 ; + Vector3d vtV2 = Z_AX ^ vtV1 ; if ( dCornerRad < EPS_SMALL) { - // Mappa con asse Z ortogonale al moto + if ( nGrid == 0) { - Vector3d vtV1 = ptE - ptS ; - double dLen1 = vtV1.Len() ; - vtV1 / dLen1 ; - Vector3d vtV2 = Z_AX ^ vtV1 ; - - // 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) ; + Vector3d vtStC( ( i + 0.5) * m_dStep - ptS.x, ( j + 0.5) * m_dStep - ptS.y, 0) ; + Vector3d vtEnC = vtStC - dLen1 * vtV1 ; - Vector3d vtC( ( i + 0.5) * m_dStep - ptS.x, ( j + 0.5) * m_dStep - ptS.y, 0) ; + double dX1 = vtStC * vtV1 ; + double dX2 = vtStC * vtV2 ; - double dX1 = vtC * vtV1 ; - double dX2 = vtC * vtV2 ; - - if ( dX1 > 0 && dX1 < dLen1 && abs( dX2) < dRad + EPS_SMALL) { - AddIntervals(nGrid, i, j, min( ptS.z, ptS.z - vtAx.z * dHei), max( ptS.z, ptS.z - vtAx.z * dHei), -Z_AX, Z_AX) ; - } - else if ( sqrt( dX1 * dX1 + dX2 * dX2) < dRad + EPS_SMALL) { - AddIntervals(nGrid, i, j, min( ptS.z, ptS.z - vtAx.z * dHei), max( ptS.z, ptS.z - vtAx.z * dHei), -Z_AX, Z_AX) ; - } - else if ( sqrt( ( dX1 - dLen1) * ( dX1 - dLen1) + dX2 * dX2) < dRad + EPS_SMALL) { - AddIntervals(nGrid, i, j, min( ptS.z, ptS.z - vtAx.z * dHei), max( ptS.z, ptS.z - vtAx.z * dHei), -Z_AX, Z_AX) ; - } + if ( ( dX1 > 0 && dX1 < dLen1 && abs( dX2) < dRad) || + vtStC.SqLen() < dRad * dRad || + vtEnC.SqLen() < dRad * dRad) { + AddIntervals( nGrid, i, j, ptS.z - dHei, ptS.z, - Z_AX, Z_AX) ; + } } } } - // Altre mappe else { - - Point3d ptITip = ptS - vtAx * dHei ; - - // Definizione terne vettoriali e sistemi di riferimento intrinseci al movimento - Vector3d vtMove = ptE - ptS ; - Vector3d vtMoveLong = ( vtMove * vtAx) * vtAx ; - Vector3d vtMoveOrt = vtMove - vtMoveLong ; - - Vector3d vtV1 = vtAx ; - Vector3d vtV2 = vtMoveOrt ; vtV2.Normalize() ; - Vector3d vtV3 = vtV1 ^ vtV2 ; - Frame3d CylFrame ; CylFrame.Set( ptITip, vtV2, vtV3, vtV1) ; - - // Parametri geometrici di moto e cilindro - double dLongLen = vtMoveLong.Len() ; - double dOrtLen = vtMoveOrt.Len() ; - + Frame3d CylFrame, PolyFrame ; + CylFrame.Set( ptS - dHei * vtAx, vtAx) ; + PolyFrame.Set( ptS - dHei * vtAx, vtV1, vtAx ^ vtV1, vtAx) ; 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) ; - + + Point3d ptC( ( i + 0.5) * m_dStep - ptS.x, ( j + 0.5) * m_dStep - ptS.y, 0) ; + Point3d ptInt1, ptInt2 ; Vector3d vtN1, vtN2 ; - - // Cilindro iniziale - CylFrame.ChangeOrig( ptITip) ; - if ( IntersLineCylinder( ptC, Z_AX, CylFrame, dHei, dRad, true, true, ptInt1, vtN1, ptInt2, vtN2)) { - SubtractIntervals( nGrid, i, j, ptInt1.z, ptInt2.z, vtN1, vtN2) ; + + if ( IntersLineCylinder( ptC, Z_AX, CylFrame, dHei, dRad, true, true, + ptInt1, vtN1, ptInt2, vtN2)) { + AddIntervals( nGrid, i, j, ptInt1.z, ptInt2.z, - vtN1, - vtN2) ; } - - // Cilindro finale:L'unica differenza rispetto a prima � l'origine - // del sistema di riferimento, quindi usiamo lo stesso sistema sommando a ptC - // il vettore che congiunge le due origini. - CylFrame.ChangeOrig( ptITip + vtMove) ; - if ( IntersLineCylinder( ptC, Z_AX, CylFrame, dHei, dRad, true, true, ptInt1, vtN1, ptInt2, vtN2)) { - SubtractIntervals( nGrid, i, j, ptInt1.z, ptInt2.z, vtN1, vtN2) ; - } - - // Poliedro interno - CylFrame.ChangeOrig( ptITip) ; - if ( IntersLineMyPolyhedron( ptC, Z_AX, CylFrame, dOrtLen, 2 * dRad, dHei, - dLongLen, ptInt1, vtN1, ptInt2, vtN2)) { - SubtractIntervals( nGrid, i, j, ptInt1.z, ptInt2.z, vtN1, vtN2) ; + + if ( IntersLineMyPolyhedron( ptC - dLen1 * vtV1, Z_AX, PolyFrame, dLen1, dRad, dHei, 0, + ptInt1, vtN1, ptInt2, vtN2)) { + AddIntervals( nGrid, i, j, ptInt1.z, ptInt2.z, - vtN1, - vtN2) ; } } } } } else { - return true ; + ; } - return true ; + + /* + if ( nGrid == 0) { + + Vector3d vtV1 = ptE - ptS ; + double dLen1 = vtV1.Len() ; + vtV1 / dLen1 ; + Vector3d vtV2 = Z_AX ^ vtV1 ; + + double dSqareCornerRadProj = dCornerRad * dCornerRad - 0.25 * dHei * dHei ; + + if ( dSqareCornerRadProj > 0) { + double dCylRad = dRad - dCornerRad + sqrt( dSquareCornerRadProj) ; + // Ciclo sui punti + for ( int i = nStartI ; i <= nEndI ; ++ i) { + for ( int j = nStartJ ; j <= nEndJ ; ++ j) { + + Vector3d vtStC( ( i + 0.5) * m_dStep - ptS.x, ( j + 0.5) * m_dStep - ptS.y, 0) ; + Vector3d vtEnC = vtStC - dLen1 * vtV1 ; + + double dX1 = vtC * vtV1 ; + double dX2 = vtC * vtV2 ; + + if ( ( dX1 > 0 && dX1 < dLen1 && abs( dX2) < dCylRad) || + vtStC.SqLen() < dCylRad * dCylRad || + vtEnC.SqLen() < dCylRad * dCylRad) { + AddIntervals( nGrid, i, j, ptS.z - dHei, ptS.z, Z_AX, - Z_AX) ; + } + else if ( dX1 > 0 && dX1 < dLen1 && abs( dX2) < dRad) { + double dr = dCornerRad - ( dRad - abs( dX2)) ; + double dDeltaH = sqrt( max( dCornerRad * dCornerRad - dr * dr, 0)) ; + Vector3d vtMinN = ( dX2 > 0 ? - dr : dr) * vtV2 + Vector3d( 0, 0, dDeltaH) ; + Vector3d vtMaxN = ( dX2 > 0 ? - dr : dr) * vtV2 - Vector3d( 0, 0, dDeltaH) ; + vtMinN.Normalize() ; + vtMaxN.Normalize() ; + AddIntervals( nGrid, i, j, ptS.z - 0.5 * dHei - dDeltaH, ptS.z - 0.5 * dHei + dDeltaH, vtMinN, vtMaxN) ; + } + else if ( vtStC.SqLen() < dRad * dRad || vtEnC.SqLen() < dRad * dRad) { + Vector3d vtR = dX1 > 0 ? vtEnC : vtStC ; + double dLenR = vtR.Len() ; + vtR /= dLenR ; + double dr = dCornerRad - ( dRad - dLenR) ; + double dDeltaH = sqrt( max( dCornerRad * dCornerRad - dr * dr, 0)) ; + Vector3d vtMinN = - dr * vtR + Vector3d( 0, 0, dDeltaH) ; + Vector3d vtMaxN = - dr * vtR - Vector3d( 0, 0, dDeltaH) ; + vtMinN.Normalize() ; + vtMaxN.Normalize() ; + AddIntervals( nGrid, i, j, ptS.z - 0.5 * dHei - dDeltaH, ptS.z - 0.5 * dHei + dDeltaH, vtMinN, vtMaxN) ; + } + } + } + } + else { + double dCylRad = dRad - dCornerRad ; + // Ciclo sui punti + for ( int i = nStartI ; i <= nEndI ; ++ i) { + for ( int j = nStartJ ; j <= nEndJ ; ++ j) { + + Vector3d vtStC( ( i + 0.5) * m_dStep - ptS.x, ( j + 0.5) * m_dStep - ptS.y, 0) ; + Vector3d vtEnC = vtStC - dLen1 * vtV1 ; + + double dX1 = vtC * vtV1 ; + double dX2 = vtC * vtV2 ; + + if ( ( dX1 > 0 && dX1 < dLen1 && abs( dX2) < dCylRad) || + vtStC.SqLen() < dCylRad * dCylRad || + vtEnC.SqLen() < dCylRad * dCylRad) { + AddIntervals( nGrid, i, j, ptS.z - dHei, ptS.z, Z_AX, - Z_AX) ; + } + else if ( dX1 > 0 && dX1 < dLen1 && abs( dX2) < dRad) { + double dr = abs( dX2) - dCylRad ; + double dDeltaH = sqrt( max( dCornerRad * dCornerRad - dr * dr, 0)) ; + Vector3d vtMinN = ( dX2 > 0 ? - dr : dr) * vtV2 + Vector3d( 0, 0, dDeltaH) ; + Vector3d vtMaxN = ( dX2 > 0 ? - dr : dr) * vtV2 - Vector3d( 0, 0, dDeltaH) ; + vtMinN.Normalize() ; + vtMaxN.Normalize() ; + AddIntervals( nGrid, i, j, ptS.z - dHei + dCornerRad - dDeltaH, ptS.z - dCornerRad + dDeltaH, vtMinN, vtMaxN) ; + } + else if ( vtStC.SqLen() < dRad * dRad || vtEnC.SqLen() < dRad * dRad) { + Vector3d vtR = dX1 > 0 ? vtEnC : vtStC ; + double dLenR = vtR.Len() ; + vtR /= dLenR ; + double dr = dLenR - dCylRad) ; + double dDeltaH = sqrt( max( dCornerRad * dCornerRad - dr * dr, 0)) ; + Vector3d vtMinN = - dr * vtR + Vector3d( 0, 0, dDeltaH) ; + Vector3d vtMaxN = - dr * vtR - Vector3d( 0, 0, dDeltaH) ; + vtMinN.Normalize() ; + vtMaxN.Normalize() ; + AddIntervals( nGrid, i, j, ptS.z - dHei + dCornerRad - dDeltaH, ptS.z - dCornerRad + dDeltaH, vtMinN, vtMaxN) ; + } + } + } + } + } + else { + ; + } + */ } // ------------------------- BOUNDING BOX --------------------------------------------------------------------------------------