EgtGeomKernel 1.4n8 :
- correzione a rotazione regioni senza collisione.
This commit is contained in:
+82
-75
@@ -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) ;
|
||||
|
||||
Reference in New Issue
Block a user