EgtGeomKernel :
- miglioria in AdjustLoops per gestire piccole autointersezioni - piccola correzione in RemoveCurveSmallParts.
This commit is contained in:
+30
-5
@@ -149,11 +149,36 @@ MyAdjustLoops( ICurve* pCurve, ICURVEPLIST& CrvLst)
|
||||
}
|
||||
// altrimenti attraversamento
|
||||
else {
|
||||
if ( IsEven( nCross))
|
||||
inOk.Subtract( vIccInfo[i].IciA[0].dU, vIccInfo[i].IciB[0].dU) ;
|
||||
else
|
||||
inOk.Add( vIccInfo[i].IciA[0].dU, vIccInfo[i].IciB[0].dU) ;
|
||||
++ nCross ;
|
||||
double dParA = vIccInfo[i].IciA[0].dU ;
|
||||
double dParB = vIccInfo[i].IciB[0].dU ;
|
||||
if ( abs( dParA - dEnd) < EPS_SMALL)
|
||||
swap( dParA, dParB) ;
|
||||
// verifico se uno dei due intervalli dà origine ad un tratto trascurabile
|
||||
PtrOwner<ICurve> pCrv1( pMyCrv->CopyParamRange( dParA, dParB)) ;
|
||||
PtrOwner<ICurve> pCrv2( pMyCrv->CopyParamRange( dParB, dParA)) ;
|
||||
double dArea1 = 0, dArea2 = 0 ;
|
||||
if ( ! IsNull( pCrv1))
|
||||
pCrv1->GetAreaXY( dArea1) ;
|
||||
if ( ! IsNull( pCrv2))
|
||||
pCrv2->GetAreaXY( dArea2) ;
|
||||
|
||||
if ( abs( dArea1) > 1e6 * abs( dArea2)) {
|
||||
// se il tratto dParB->dParA non è significativo
|
||||
inOk.Subtract( dStart, dParA) ;
|
||||
inOk.Subtract( dParB, dEnd) ;
|
||||
}
|
||||
else if ( abs( dArea2) > 1e6 * abs( dArea1)) {
|
||||
// se il tratto dParA->dParB non è siginificativo
|
||||
inOk.Subtract( dParA, dParB) ;
|
||||
}
|
||||
else {
|
||||
// se entrambe le regioni sono significative
|
||||
if ( IsEven( nCross))
|
||||
inOk.Subtract( vIccInfo[i].IciA[0].dU, vIccInfo[i].IciB[0].dU) ;
|
||||
else
|
||||
inOk.Add( vIccInfo[i].IciA[0].dU, vIccInfo[i].IciB[0].dU) ;
|
||||
++ nCross ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user