EgtGeomKernel :

- migliorata gestione delle curve composite chiuse forzando i punti iniziale e finale a coincidere se necessario
- migliorato calcolo area delle polyline nel caso di estremi non perfettamente coincidenti.
This commit is contained in:
SaraP
2024-01-30 15:50:23 +01:00
parent debf3d65ba
commit 2a43eca91c
2 changed files with 19 additions and 1 deletions
+13 -1
View File
@@ -267,7 +267,7 @@ CurveComposite::AddSimpleCurve( ICurve* pSmplCrv, bool bEndOrStart, double dLinT
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
return true ;
return Validate() ;
}
//----------------------------------------------------------------------------
@@ -856,6 +856,18 @@ CurveComposite::Validate( void)
m_nStatus = ( nCount > 0 ? OK : TO_VERIFY) ;
}
// verifico chiusura
if ( IsClosed()) {
Point3d ptStart ; m_CrvSmplS.front()->GetStartPoint( ptStart) ;
Point3d ptEnd ; m_CrvSmplS.back()->GetEndPoint( ptEnd) ;
// se distanza superiore al limite ridotto forzo i punti a coincidere
if ( ! AreSamePointEpsilon( ptStart, ptEnd, 0.01 * EPS_SMALL)) {
Point3d ptM = Media( ptStart, ptEnd) ;
m_CrvSmplS.front()->ModifyEnd( ptM) ;
m_CrvSmplS.back()->ModifyStart( ptM) ;
}
}
return ( m_nStatus == OK) ;
}
+6
View File
@@ -645,6 +645,12 @@ PolyLine::GetAreaXY( double& dArea) const
for ( bool bFound = GetFirstLine( ptIni, ptFin) ; bFound ; bFound = GetNextLine( ptIni, ptFin)) {
dArea += ( ptIni.x - ptFin.x) * ( ptIni.y + ptFin.y) ; // projection on xy
}
// considero anche la linea tra l'ultimo e il primo punto perchè in alcuni casi potrebbero definire area
// significativa anche se sono coincidenti per le nostre tolleranze
ptIni = ptFin ;
GetFirstPoint( ptFin) ;
if ( ! AreSamePointExact( ptIni, ptFin))
dArea += ( ptIni.x - ptFin.x) * ( ptIni.y + ptFin.y) ;
dArea = 0.5 * dArea ;
return true ;
}