diff --git a/CurveArc.cpp b/CurveArc.cpp index 8d64260..b411c0d 100644 --- a/CurveArc.cpp +++ b/CurveArc.cpp @@ -2035,10 +2035,6 @@ CurveArc::Flip( void) //---------------------------------------------------------------------------- ArcApproxer::ArcApproxer( double dLinTol, double dAngTolDeg, bool bInside, const CurveArc& arArc) { - int nStep ; - double dAngStepDeg ; - - // inizializzazioni m_nTotPnt = 0 ; m_nCurrPnt = - 1 ; @@ -2056,6 +2052,7 @@ ArcApproxer::ArcApproxer( double dLinTol, double dAngTolDeg, bool bInside, const dAngTolDeg = min( dAngTolDeg, ANG_TOL_EXT_MAX_DEG) ; // determinazione dello step angolare + double dAngStepDeg ; double dLinTolRel = dLinTol / arArc.GetRadius() ; if ( bInside) dAngStepDeg = sqrt( 8 * dLinTolRel) * RADTODEG ; @@ -2064,7 +2061,7 @@ ArcApproxer::ArcApproxer( double dLinTol, double dAngTolDeg, bool bInside, const dAngStepDeg = min( dAngStepDeg, dAngTolDeg) ; // dall'angolo al centro ricavo il numero di passi - nStep = (int) ( abs( arArc.GetAngCenter()) / dAngStepDeg + 0.999) ; + int nStep = int( abs( arArc.GetAngCenter()) / dAngStepDeg + 0.999) ; nStep = max( nStep, 1) ; // sistemo lo step (per il numero intero di passi) @@ -2091,10 +2088,6 @@ ArcApproxer::ArcApproxer( double dLinTol, double dAngTolDeg, bool bInside, const bool ArcApproxer::GetPoint( double& dU, Point3d& ptP) { - Vector3d vtA1p ; - Vector3d vtA2p ; - - // incremento indice punto corrente ++ m_nCurrPnt ; @@ -2125,8 +2118,8 @@ ArcApproxer::GetPoint( double& dU, Point3d& ptP) else dU = ( m_nCurrPnt - 0.5) / (double) ( m_nTotPnt - 2) ; // nuovo valore versori - vtA1p = m_vtA1 ; - vtA2p = m_vtA2 ; + Vector3d vtA1p = m_vtA1 ; + Vector3d vtA2p = m_vtA2 ; m_vtA1 = m_dCosA * vtA1p + m_dSinA * vtA2p ; m_vtA2 = - m_dSinA * vtA1p + m_dCosA * vtA2p ; // calcolo del punto diff --git a/PolyLine.cpp b/PolyLine.cpp index 846c90d..6e21692 100644 --- a/PolyLine.cpp +++ b/PolyLine.cpp @@ -515,8 +515,11 @@ PolyLine::IsFlat( int& nRank, Point3d& ptCen, Vector3d& vtDir, double dToler) co // cerco le componenti principali (tramite PCA) Point3d ptP1, ptP2 ; PointsPCA ptsPCA ; - for ( bool bFound = GetFirstLine( ptP1, ptP2) ; bFound ; bFound = GetNextLine( ptP1, ptP2)) - ptsPCA.AddPoint( Media( ptP1, ptP2), Dist( ptP1, ptP2)) ; + for ( bool bFound = GetFirstLine( ptP1, ptP2) ; bFound ; bFound = GetNextLine( ptP1, ptP2)) { + double dLen = Dist( ptP1, ptP2) ; + ptsPCA.AddPoint( Media( ptP1, ptP2, 0.25), dLen / 2) ; + ptsPCA.AddPoint( Media( ptP1, ptP2, 0.75), dLen / 2) ; + } // recupero il rango, ovvero la dimensionalità dell'insieme di punti nRank = ptsPCA.GetRank() ; // se dimensione nulla, o non ci sono punti o sono tutti praticamente coincidenti diff --git a/Triangulate.cpp b/Triangulate.cpp index 27e3684..f9aba85 100644 --- a/Triangulate.cpp +++ b/Triangulate.cpp @@ -45,6 +45,9 @@ Triangulate::Make( const PolyLine& PL, PNTVECTOR& vPt, INTVECTOR& vTr) // pulisco i vettori di ritorno vPt.clear() ; vTr.clear() ; + // verifico che la polilinea contenga almeno 4 punti (primo e ultimo coincidenti) + if ( PL.GetPointNbr() < 4) + return false ; // verifico che la polilinea sia chiusa e piana e calcolo il piano medio del poligono double dArea ; Plane3d plPlane ;