diff --git a/CurveComposite.cpp b/CurveComposite.cpp index 823a89c..71bd653 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -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) ; } diff --git a/PolyLine.cpp b/PolyLine.cpp index d9fb83a..8a18072 100644 --- a/PolyLine.cpp +++ b/PolyLine.cpp @@ -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 ; }