diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 55474c7..5f56abf 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/Simple CDSurfFrMove.cpp b/Simple CDSurfFrMove.cpp index b4d9dcc..02feff7 100644 --- a/Simple CDSurfFrMove.cpp +++ b/Simple CDSurfFrMove.cpp @@ -586,88 +586,95 @@ MySimpleCDSurfFrMove::RotateLineNoCollisionLine( const CurveLine* pLine1, const // calcolo la minima rotazione degli estremi interni all'intervallo comune double dNewAng = dAng ; - if ( dRadS1 >= dRadS2) { - vtDirS1 /= dRadS1 ; - CurveArc ArcS1 ; - ArcS1.Set( ptCen, Z_AX, dRadS1, vtDirS1, dAng, 0) ; - IntersLineArc intLA( *pLine2, ArcS1) ; - if ( intLA.GetNumInters() == 2) { - IntCrvCrvInfo iccInfo1, iccInfo2 ; - intLA.GetIntCrvCrvInfo( 0, iccInfo1) ; - intLA.GetIntCrvCrvInfo( 1, iccInfo2) ; - dNewAng = dAng * min( iccInfo1.IciB[0].dU, iccInfo2.IciB[0].dU) ; + if ( ! AreSamePointXYEpsilon( ptS1, ptS2, 10 * EPS_SMALL)) { + if ( dRadS1 >= dRadS2) { + vtDirS1 /= dRadS1 ; + CurveArc ArcS1 ; + ArcS1.Set( ptCen, Z_AX, dRadS1, vtDirS1, dAng, 0) ; + IntersLineArc intLA( *pLine2, ArcS1) ; + if ( intLA.GetNumInters() == 2) { + IntCrvCrvInfo iccInfo1, iccInfo2 ; + intLA.GetIntCrvCrvInfo( 0, iccInfo1) ; + intLA.GetIntCrvCrvInfo( 1, iccInfo2) ; + dNewAng = dAng * min( iccInfo1.IciB[0].dU, iccInfo2.IciB[0].dU) ; + } + else if ( intLA.GetNumInters() == 1) { + IntCrvCrvInfo iccInfo ; + intLA.GetIntCrvCrvInfo( 0, iccInfo) ; + dNewAng = dAng * iccInfo.IciB[0].dU ; + } } - else if ( intLA.GetNumInters() == 1) { - IntCrvCrvInfo iccInfo ; - intLA.GetIntCrvCrvInfo( 0, iccInfo) ; - dNewAng = dAng * iccInfo.IciB[0].dU ; + else { + vtDirS2 /= dRadS2 ; + CurveArc ArcS2 ; + ArcS2.Set( ptCen, Z_AX, dRadS2, vtDirS2, - dAng, 0) ; + IntersLineArc intLA( *pLine1, ArcS2) ; + if ( intLA.GetNumInters() == 2) { + IntCrvCrvInfo iccInfo1, iccInfo2 ; + intLA.GetIntCrvCrvInfo( 0, iccInfo1) ; + intLA.GetIntCrvCrvInfo( 1, iccInfo2) ; + dNewAng = dAng * min( iccInfo1.IciB[0].dU, iccInfo2.IciB[0].dU) ; + } + else if ( intLA.GetNumInters() == 1) { + IntCrvCrvInfo iccInfo ; + intLA.GetIntCrvCrvInfo( 0, iccInfo) ; + dNewAng = dAng * iccInfo.IciB[0].dU ; + } } } - else { - vtDirS2 /= dRadS2 ; - CurveArc ArcS2 ; - ArcS2.Set( ptCen, Z_AX, dRadS2, vtDirS2, - dAng, 0) ; - IntersLineArc intLA( *pLine1, ArcS2) ; - if ( intLA.GetNumInters() == 2) { - IntCrvCrvInfo iccInfo1, iccInfo2 ; - intLA.GetIntCrvCrvInfo( 0, iccInfo1) ; - intLA.GetIntCrvCrvInfo( 1, iccInfo2) ; - dNewAng = dAng * min( iccInfo1.IciB[0].dU, iccInfo2.IciB[0].dU) ; + if ( ! AreSamePointXYEpsilon( ptE1, ptE2, 10 * EPS_SMALL)) { + if ( dRadE1 <= dRadE2) { + vtDirE1 /= dRadE1 ; + CurveArc ArcE1 ; + ArcE1.Set( ptCen, Z_AX, dRadE1, vtDirE1, dAng, 0) ; + IntersLineArc intLA( *pLine2, ArcE1) ; + if ( intLA.GetNumInters() == 2) { + IntCrvCrvInfo iccInfo1, iccInfo2 ; + intLA.GetIntCrvCrvInfo( 0, iccInfo1) ; + intLA.GetIntCrvCrvInfo( 1, iccInfo2) ; + if ( bCCW) + dNewAng = min( dNewAng, dAng * min( iccInfo1.IciB[0].dU, iccInfo2.IciB[0].dU)) ; + else + dNewAng = max( dNewAng, dAng * min( iccInfo1.IciB[0].dU, iccInfo2.IciB[0].dU)) ; + } + else if ( intLA.GetNumInters() == 1) { + IntCrvCrvInfo iccInfo ; + intLA.GetIntCrvCrvInfo( 0, iccInfo) ; + if ( bCCW) + dNewAng = min( dNewAng, dAng * iccInfo.IciB[0].dU) ; + else + dNewAng = max( dNewAng, dAng * iccInfo.IciB[0].dU) ; + } } - else if ( intLA.GetNumInters() == 1) { - IntCrvCrvInfo iccInfo ; - intLA.GetIntCrvCrvInfo( 0, iccInfo) ; - dNewAng = dAng * iccInfo.IciB[0].dU ; - } - } - if ( dRadE1 <= dRadE2) { - vtDirE1 /= dRadE1 ; - CurveArc ArcE1 ; - ArcE1.Set( ptCen, Z_AX, dRadE1, vtDirE1, dAng, 0) ; - IntersLineArc intLA( *pLine2, ArcE1) ; - if ( intLA.GetNumInters() == 2) { - IntCrvCrvInfo iccInfo1, iccInfo2 ; - intLA.GetIntCrvCrvInfo( 0, iccInfo1) ; - intLA.GetIntCrvCrvInfo( 1, iccInfo2) ; - if ( bCCW) - dNewAng = min( dNewAng, dAng * min( iccInfo1.IciB[0].dU, iccInfo2.IciB[0].dU)) ; - else - dNewAng = max( dNewAng, dAng * min( iccInfo1.IciB[0].dU, iccInfo2.IciB[0].dU)) ; - } - else if ( intLA.GetNumInters() == 1) { - IntCrvCrvInfo iccInfo ; - intLA.GetIntCrvCrvInfo( 0, iccInfo) ; - if ( bCCW) - dNewAng = min( dNewAng, dAng * iccInfo.IciB[0].dU) ; - else - dNewAng = max( dNewAng, dAng * iccInfo.IciB[0].dU) ; - } - } - else { - vtDirE2 /= dRadE2 ; - CurveArc ArcE2 ; - ArcE2.Set( ptCen, Z_AX, dRadE2, vtDirE2, - dAng, 0) ; - IntersLineArc intLA( *pLine1, ArcE2) ; - if ( intLA.GetNumInters() == 2) { - IntCrvCrvInfo iccInfo1, iccInfo2 ; - intLA.GetIntCrvCrvInfo( 0, iccInfo1) ; - intLA.GetIntCrvCrvInfo( 1, iccInfo2) ; - if ( bCCW) - dNewAng = min( dNewAng, dAng * min( iccInfo1.IciB[0].dU, iccInfo2.IciB[0].dU)) ; - else - dNewAng = max( dNewAng, dAng * min( iccInfo1.IciB[0].dU, iccInfo2.IciB[0].dU)) ; - } - else if ( intLA.GetNumInters() == 1) { - IntCrvCrvInfo iccInfo ; - intLA.GetIntCrvCrvInfo( 0, iccInfo) ; - if ( bCCW) - dNewAng = min( dNewAng, dAng * iccInfo.IciB[0].dU) ; - else - dNewAng = max( dNewAng, dAng * iccInfo.IciB[0].dU) ; + else { + vtDirE2 /= dRadE2 ; + CurveArc ArcE2 ; + ArcE2.Set( ptCen, Z_AX, dRadE2, vtDirE2, - dAng, 0) ; + IntersLineArc intLA( *pLine1, ArcE2) ; + if ( intLA.GetNumInters() == 2) { + IntCrvCrvInfo iccInfo1, iccInfo2 ; + intLA.GetIntCrvCrvInfo( 0, iccInfo1) ; + intLA.GetIntCrvCrvInfo( 1, iccInfo2) ; + if ( bCCW) + dNewAng = min( dNewAng, dAng * min( iccInfo1.IciB[0].dU, iccInfo2.IciB[0].dU)) ; + else + dNewAng = max( dNewAng, dAng * min( iccInfo1.IciB[0].dU, iccInfo2.IciB[0].dU)) ; + } + else if ( intLA.GetNumInters() == 1) { + IntCrvCrvInfo iccInfo ; + intLA.GetIntCrvCrvInfo( 0, iccInfo) ; + if ( bCCW) + dNewAng = min( dNewAng, dAng * iccInfo.IciB[0].dU) ; + else + dNewAng = max( dNewAng, dAng * iccInfo.IciB[0].dU) ; + } } } + if ( AreSamePointXYEpsilon( ptS1, ptS2, 10 * EPS_SMALL) && + AreSamePointXYEpsilon( ptE1, ptE2, 10 * EPS_SMALL)) + dNewAng = 0 ; // confronto con rotazione corrente - if ( abs( dNewAng) < EPS_SMALL) + if ( abs( dNewAng) < EPS_ANG_SMALL) dAng = 0 ; else if ( bCCW && dNewAng > 0) dAng = min( dAng, dNewAng) ;