EgtGeomKernel 1.4n8 :

- correzione a rotazione regioni senza collisione.
This commit is contained in:
Dario Sassi
2016-02-22 18:34:49 +00:00
parent 16e134cadf
commit 97727f2afd
2 changed files with 82 additions and 75 deletions
+82 -75
View File
@@ -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) ;