EgtGeomKernel 1.6s2 :

- a IntersCurveCurve aggiunta GetRegionCurveClassification.
This commit is contained in:
Dario Sassi
2016-07-06 16:02:30 +00:00
parent 874bd1f848
commit b384a42d74
3 changed files with 70 additions and 49 deletions
BIN
View File
Binary file not shown.
+58 -1
View File
@@ -642,4 +642,61 @@ IntersCurveCurve::GetCurveOutClass( const ICurve* pCurve, int& nClass)
return false ;
nClass = (( dArea > 0) ? CRVC_OUT : CRVC_IN) ;
return true ;
}
}
//----------------------------------------------------------------------------
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 ;
}
+12 -48
View File
@@ -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 ;
}
}