diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 9fbeeab..21309bc 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/IntersCurveCurve.cpp b/IntersCurveCurve.cpp index 6614430..3ee9ee0 100644 --- a/IntersCurveCurve.cpp +++ b/IntersCurveCurve.cpp @@ -642,4 +642,61 @@ IntersCurveCurve::GetCurveOutClass( const ICurve* pCurve, int& nClass) return false ; nClass = (( dArea > 0) ? CRVC_OUT : CRVC_IN) ; return true ; -} \ No newline at end of file +} + +//---------------------------------------------------------------------------- +int +IntersCurveCurve::GetRegionCurveClassification( void) +{ + // classifico la prima curva rispetto alla seconda + CRVCVECTOR ccClass ; + if ( ! GetCurveClassification( 0, ccClass)) + return CCREGC_NULL ; + // derivo la classificazione delle curve come regioni + bool bIn = false ; + bool bOut = false ; + bool bOnP = false ; + bool bOnM = false ; + for ( auto& ccOne : ccClass) { + switch ( ccOne.nClass) { + case CRVC_IN : + bIn = true ; + break ; + case CRVC_OUT : + bOut = true ; + break ; + case CRVC_ON_P : + bOnP = true ; + break ; + case CRVC_ON_M : + bOnM = true ; + break ; + default : + return CCREGC_NULL ; + } + } + if ( bIn) { + if ( bOut) + return CCREGC_INTERS ; + else + return CCREGC_IN1 ; + } + if ( bOut) { + if ( bOnM) + return CCREGC_OUT ; + if ( bOnP) + return CCREGC_IN2 ; + CRVCVECTOR ccClass2 ; + if ( ! GetCurveClassification( 1, ccClass2) || ccClass2.empty()) + return CCREGC_NULL ; + if ( ccClass2[0].nClass == CRVC_OUT) + return CCREGC_OUT ; + else + return CCREGC_IN2 ; + } + if ( bOnP) + return CCREGC_SAME ; + if ( bOnM) + return CCREGC_OUT ; + return CCREGC_NULL ; +} diff --git a/SurfFlatRegion.cpp b/SurfFlatRegion.cpp index c411b3a..6c349a5 100644 --- a/SurfFlatRegion.cpp +++ b/SurfFlatRegion.cpp @@ -1235,55 +1235,19 @@ SurfFlatRegion::GetChunkSimpleClassification( int nChunk, const ISurfFlatRegion& // classifico il loop esterno del chunk della prima regione rispetto a quello del chunk della seconda IntersCurveCurve ccInt( *pCrv1Loc, *pCrv2Loc) ; - CRVCVECTOR ccClass ; - if ( ! ccInt.GetCurveClassification( 0, ccClass)) + int nClass = ccInt.GetRegionCurveClassification() ; + switch ( nClass){ + default : // CCREGC_NULL return REGC_NULL ; - // derivo la classificazione dei chunk delle regioni - bool bIn = false ; - bool bOut = false ; - bool bOnP = false ; - bool bOnM = false ; - for ( auto& ccOne : ccClass) { - switch ( ccOne.nClass) { - case CRVC_IN : - bIn = true ; - break ; - case CRVC_OUT : - bOut = true ; - break ; - case CRVC_ON_P : - bOnP = true ; - break ; - case CRVC_ON_M : - bOnM = true ; - break ; - default : - return REGC_NULL ; - } - } - if ( bIn) { - if ( bOut) - return REGC_INTERS ; - else - return REGC_IN1 ; - } - if ( bOut) { - if ( bOnM) - return REGC_OUT ; - if ( bOnP) - return REGC_IN2 ; - CRVCVECTOR ccClass2 ; - if ( ! ccInt.GetCurveClassification( 1, ccClass2) || ccClass2.empty()) - return REGC_NULL ; - if ( ccClass2[0].nClass == CRVC_OUT) - return REGC_OUT ; - else - return REGC_IN2 ; - } - if ( bOnP) + case CCREGC_IN1 : + return REGC_IN1 ; + case CCREGC_IN2 : + return REGC_IN2 ; + case CCREGC_SAME : return REGC_SAME ; - if ( bOnM) + case CCREGC_OUT : return REGC_OUT ; - - return REGC_NULL ; + case CCREGC_INTERS : + return REGC_INTERS ; + } }