From 97727f2afd055ae256869265e2ce80e5cd77ef25 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 22 Feb 2016 18:34:49 +0000 Subject: [PATCH] EgtGeomKernel 1.4n8 : - correzione a rotazione regioni senza collisione. --- EgtGeomKernel.rc | Bin 11718 -> 11718 bytes Simple CDSurfFrMove.cpp | 157 +++++++++++++++++++++------------------- 2 files changed, 82 insertions(+), 75 deletions(-) diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 55474c7816e46f0b925b826f858ebd8b737143bc..5f56abf3abfc0e2f9e648fa3fdb36da111402434 100644 GIT binary patch delta 110 zcmX>WeJpyzA2vpd&G-4vGfl1&(wY2&Q;pGLvZAo=W*@FeEMOU1X1ItOWeJpyzA2vqw&G-4vGfl1&(wY2&Q;pGlvZAo=W*@FeEMOU1X1ItO= 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) ;