diff --git a/PolyLine.cpp b/PolyLine.cpp index 755b064..4678ce9 100644 --- a/PolyLine.cpp +++ b/PolyLine.cpp @@ -587,18 +587,29 @@ PolyLine::IsClosedAndFlat( Plane3d& plPlane, double& dArea, double dToler) const // Test if closed if ( ! IsClosed()) return false ; - // Compute a representative plane for the polygon Point3d ptP ; + // Calcolo il centro (per minimizzare gli errori nelle successive operazioni) + Point3d ptCen = ORIG ; + int nCount = 0 ; + for ( bool bFound = GetFirstPoint( ptP) ; bFound ; bFound = GetNextPoint( ptP)) { + ptCen += ptP ; + ++ nCount ; + } + ptCen /= nCount ; + Vector3d vtMove = ptCen - ORIG ; + // Compute a representative plane for the polygon (faccio il calcolo nel centro e poi traslo al contrario il piano) PolygonPlane PolyPlane ; for ( bool bFound = GetFirstPoint( ptP) ; bFound ; bFound = GetNextPoint( ptP)) - PolyPlane.AddPoint( ptP) ; + PolyPlane.AddPoint( ptP - vtMove) ; if ( ! PolyPlane.GetPlane( plPlane) || ! PolyPlane.GetArea( dArea)) { dArea = 0 ; return IsFlat( plPlane, dToler) ; } + plPlane.Translate( vtMove) ; + // Sistemo il piano per l'offset utilizzato // Test each vertex to see if it is farther from plane than allowed max distance for ( bool bFound = GetFirstPoint( ptP) ; bFound ; bFound = GetNextPoint( ptP)) { - double dDist = ( ( ptP - ORIG) * plPlane.GetVersN()) - plPlane.GetDist() ; + double dDist = DistPointPlane( ptP, plPlane) ; if ( abs( dDist) > dToler) return false ; } diff --git a/SurfFlatRegion.cpp b/SurfFlatRegion.cpp index 0027f7c..41b74cb 100644 --- a/SurfFlatRegion.cpp +++ b/SurfFlatRegion.cpp @@ -109,18 +109,25 @@ SurfFlatRegion::AddExtLoop( ICurve* pCrv) if ( ! AdjustLoops( Release( pMyCrv), CrvLst, true)) return false ; // aggiungo le singole curve + int nExtAdded = 0 ; bool bOk = true ; for ( auto& pSingCrv : CrvLst) { - if ( ! AddSimpleExtLoop( pSingCrv)) + bool bAdded = false ; + if ( AddSimpleExtLoop( pSingCrv, bAdded)) + ++ nExtAdded ; + else bOk = false ; + } - return bOk ; + return ( bOk && nExtAdded > 0) ; } //---------------------------------------------------------------------------- bool -SurfFlatRegion::AddSimpleExtLoop( ICurve* pCrv) +SurfFlatRegion::AddSimpleExtLoop( ICurve* pCrv, bool& bAdded) { + // default + bAdded = false ; // acquisisco la curva PtrOwner pMyCrv( pCrv) ; if ( IsNull( pMyCrv)) @@ -133,6 +140,8 @@ SurfFlatRegion::AddSimpleExtLoop( ICurve* pCrv) Plane3d plPlane ; if ( ! pMyCrv->GetArea( plPlane, dArea)) return false ; + if ( dArea < SQ_EPS_SMALL) + return true ; // se sto costruendo il primo chunk if ( m_vExtInd.size() == 0) { // assegno il riferimento intrinseco @@ -198,6 +207,7 @@ SurfFlatRegion::AddSimpleExtLoop( ICurve* pCrv) m_OGrMgr.Reset() ; // imposto ricalcolo Voronoi ResetVoronoiObject() ; + bAdded = true ; return true ; } diff --git a/SurfFlatRegion.h b/SurfFlatRegion.h index c1198e8..d257fce 100644 --- a/SurfFlatRegion.h +++ b/SurfFlatRegion.h @@ -142,7 +142,7 @@ class SurfFlatRegion : public ISurfFlatRegion, public IGeoObjRW private : bool CopyFrom( const SurfFlatRegion& clSrc) ; - bool AddSimpleExtLoop( ICurve* pCrv) ; + bool AddSimpleExtLoop( ICurve* pCrv, bool& bAdded) ; bool MyAddExtLoop( ICurve* pCrv) ; bool AddSimpleIntLoop( ICurve* pCrv) ; bool MyAddIntLoop( ICurve* pCrv, int nChunk) ;