EgtGeomKernel 1.6k2 :

- corretto calcolo bounding box di regioni multi-chunk
- corretto offset di regioni multi-chunk.
This commit is contained in:
Dario Sassi
2015-11-05 13:41:52 +00:00
parent 41f8b0d103
commit 2de710bad1
3 changed files with 46 additions and 10 deletions
+28 -6
View File
@@ -31,9 +31,14 @@ SurfFlatRegion::Offset( double dDist, int nType)
PtrOwner<SurfFlatRegion> pSfr( new SurfFlatRegion) ;
if ( IsNull( pSfr))
return false ;
bool bFirstRegion = true ;
// ciclo sui chunk
bool bFirstCurve = true ;
for ( int i = 0 ; i < nChunk ; ++ i) {
// creo la regione del chunk
PtrOwner<SurfFlatRegion> pSfrChk( new SurfFlatRegion) ;
if ( IsNull( pSfrChk))
return false ;
bool bFirstCurve = true ;
// ciclo sui loop di ogni chunk
int nLoop = GetLoopCount( i) ;
for ( int j = 0 ; j < nLoop ; ++ j) {
@@ -47,9 +52,9 @@ SurfFlatRegion::Offset( double dDist, int nType)
// recupero le curve di offset
PtrOwner<ICurve> pOffs( OffsCrv.GetCurve()) ;
while ( bOk && ! IsNull( pOffs)) {
// se prima curva esterna in assoluto, è il primo contorno esterno della nuova regione
if ( bFirstCurve && j == 0) {
if ( ! pSfr->AddExtLoop( Release( pOffs)))
// se prima curva esterna, è il primo contorno esterno della nuova regione
if ( j == 0 && bFirstCurve) {
if ( ! pSfrChk->AddExtLoop( Release( pOffs)))
return false ;
bFirstCurve = false ;
}
@@ -64,12 +69,12 @@ SurfFlatRegion::Offset( double dDist, int nType)
return false ;
// se era loop esterno, lo aggiungo alla nuova regione
if ( j == 0) {
if ( ! pSfr->Add( *Get( pSfr2)))
if ( ! pSfrChk->Add( *Get( pSfr2)))
return false ;
}
// altrimenti loop interno, lo sottraggo alla nuova regione
else {
if ( ! pSfr->Subtract( *Get( pSfr2)))
if ( ! pSfrChk->Subtract( *Get( pSfr2)))
return false ;
}
}
@@ -77,6 +82,23 @@ SurfFlatRegion::Offset( double dDist, int nType)
pOffs.Set( OffsCrv.GetCurve()) ;
}
}
// se regione di chunk valida
if ( ! bFirstCurve) {
// se prima regione di chunk, ne sposto i dati nella nuova regione
if ( bFirstRegion) {
pSfr->m_vExtInd = pSfrChk->m_vExtInd ;
pSfr->m_vpLoop = pSfrChk->m_vpLoop ;
for ( auto& pLoop : pSfrChk->m_vpLoop)
pLoop = nullptr ;
pSfr->m_nStatus = pSfrChk->m_nStatus ;
bFirstRegion = false ;
}
// altrimenti la aggiungo alla nuova regione
else {
if ( ! pSfr->Add( *Get( pSfrChk)))
return false ;
}
}
}
// pulisco la superficie corrente