EgtGeomKernel :

- a ExtText aggiunta GetAuxSurf (solo per font di sistema)
- molto migliorata gestione anelli e spikes nella creazione di regioni.
This commit is contained in:
Dario Sassi
2020-06-02 10:12:47 +00:00
parent e8796dac88
commit e6d64e2c60
9 changed files with 239 additions and 27 deletions
+28 -16
View File
@@ -57,11 +57,8 @@ MyAdjustLoops( ICurve* pCurve, ICURVEPLIST& CrvLst)
// Calcolo le auto intersezioni
SelfIntersCurve sintC( *pMyCrv) ;
// se ci sono auto-intersezioni che si attraversano (anche con sovrapposizione), errore
if ( sintC.GetCrossIntersCount() > 0)
return false ;
// se non ci sono auto-intersezioni che si toccano (anche con sovrapposizione), non devo fare alcunché
if ( sintC.GetTouchIntersCount() == 0) {
// se non ci sono auto-intersezioni che si attraversano o che si toccano (anche con sovrapposizione), non devo fare alcunché
if ( sintC.GetCrossIntersCount() == 0 && sintC.GetTouchIntersCount() == 0) {
// riporto la curva nel riferimento originale
if ( bNeedRef)
pMyCrv->ToGlob( frExtr) ;
@@ -77,25 +74,40 @@ MyAdjustLoops( ICurve* pCurve, ICURVEPLIST& CrvLst)
Intervals inOk( EPS_PARAM) ;
inOk.Set( dStart, dEnd) ;
// Tolgo le parti in sovrapposizione da eliminare
// Tolgo le parti da eliminare
IntCrvCrvInfo iccInfo ;
for ( int i = 0 ; sintC.GetIntCrvCrvInfo( i, iccInfo) ; ++ i) {
// se sovrapposti
// se con sovrapposizione
if ( iccInfo.bOverlap) {
// se equiversi, elimino solo uno dei due tratti
if ( iccInfo.bCBOverEq) {
inOk.Subtract( iccInfo.IciB[0].dU, iccInfo.IciB[1].dU) ;
}
// se altrimenti controversi, elimino entrambi i tratti
else if ( ! iccInfo.bCBOverEq) {
// se solo touch
if ( ( iccInfo.IciA[0].nPrevTy == iccInfo.IciA[1].nNextTy ||
iccInfo.IciA[0].nPrevTy == ICCT_SPK || iccInfo.IciA[1].nNextTy == ICCT_SPK) &&
iccInfo.IciA[0].nPrevTy != ICCT_NULL && iccInfo.IciA[1].nNextTy != ICCT_NULL) {
// obbligatoriamente controversi, elimino entrambi i tratti
inOk.Subtract( iccInfo.IciA[0].dU, iccInfo.IciA[1].dU) ;
inOk.Subtract( iccInfo.IciB[0].dU, iccInfo.IciB[1].dU) ;
}
// altrimenti attraversamento
else {
// elimino la parte interna
if ( iccInfo.bCBOverEq)
inOk.Subtract( iccInfo.IciA[0].dU, iccInfo.IciB[0].dU) ;
else
inOk.Subtract( min( iccInfo.IciA[0].dU, iccInfo.IciB[1].dU), max( iccInfo.IciB[0].dU, iccInfo.IciA[1].dU)) ;
}
}
// altrimenti sono touch
// altrimenti
else {
inOk.Subtract( iccInfo.IciA[0].dU, iccInfo.IciA[0].dU) ;
inOk.Subtract( iccInfo.IciB[0].dU, iccInfo.IciB[0].dU) ;
// se solo touch
if ( iccInfo.IciA[0].nPrevTy == iccInfo.IciA[0].nNextTy &&
iccInfo.IciA[0].nPrevTy != ICCT_NULL && iccInfo.IciA[0].nNextTy != ICCT_NULL) {
inOk.Subtract( iccInfo.IciA[0].dU, iccInfo.IciA[0].dU) ;
inOk.Subtract( iccInfo.IciB[0].dU, iccInfo.IciB[0].dU) ;
}
// altrimenti attraversamento
else {
inOk.Subtract( iccInfo.IciA[0].dU, iccInfo.IciB[0].dU) ;
}
}
}