diff --git a/CurveAux.cpp b/CurveAux.cpp index 3adb9f2..bf755c1 100644 --- a/CurveAux.cpp +++ b/CurveAux.cpp @@ -295,7 +295,7 @@ CurveGetAreaXY( const ICurve& crvC, double& dArea) return false ; // approssimo la curva con una polilinea PolyLine PL ; - crvC.ApproxWithLines( LIN_TOL_STD, ANG_TOL_STD_DEG, ICurve::APL_STD, PL) ; + crvC.ApproxWithLines( LIN_TOL_STD, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL) ; // calcolo l'area double dAreaXY = 0 ; PL.GetAreaXY( dAreaXY) ; @@ -314,7 +314,7 @@ CurveGetArea( const ICurve& crvC, Plane3d& plPlane, double& dArea) return false ; // approssimo la curva con una polilinea PolyLine PL ; - crvC.ApproxWithLines( LIN_TOL_STD, ANG_TOL_STD_DEG, ICurve::APL_STD, PL) ; + crvC.ApproxWithLines( LIN_TOL_STD, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL) ; // calcolo l'area Plane3d plMyPlane ; double dMyArea = 0 ; diff --git a/CurveComposite.cpp b/CurveComposite.cpp index 5b66bfe..9bf10ad 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -957,7 +957,7 @@ CurveComposite::GetCentroid( Point3d& ptCen) const return false ; // approssimo la curva con una polilinea PolyLine PL ; - if ( ! ApproxWithLines( LIN_TOL_STD, ANG_TOL_STD_DEG, ICurve::APL_STD, PL)) + if ( ! ApproxWithLines( LIN_TOL_STD, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL)) return false ; // calcolo il centro mediante PolygonPlane Point3d ptP ; @@ -1255,15 +1255,39 @@ CurveComposite::ApproxWithLines( double dLinTol, double dAngTolDeg, int nType, P dLinTol = max( dLinTol, LIN_TOL_MIN) ; dAngTolDeg = max( dAngTolDeg, ANG_TOL_MIN_DEG) ; - // se lineare con lato obbligato, gestione speciale + // se speciale, approssimo ogni singola entitā e conservo le estremitā interne (joint) + if ( nType == APL_SPECIAL) { + // eseguo approssimazione + double dStartPar = 0 ; + for ( auto& pCrv : m_CrvSmplS) { + // assegno estrusione e spessore della curva composita + pCrv->SetExtrusion( m_VtExtr) ; + pCrv->SetThickness( m_dThick) ; + // recupero approssimazione per curva semplice + PolyLine PLSmpl ; + if ( ! pCrv->ApproxWithLines( dLinTol, dAngTolDeg, nType, PLSmpl)) + return false ; + // ripristino estrusione e spessore della curva semplice (annullandoli) + pCrv->SetExtrusion( V_NULL) ; + pCrv->SetThickness( 0) ; + // la accodo opportunamente a quella della curva composita + if ( ! PL.Join( PLSmpl, dStartPar)) + return false ; + // incremento inizio parametro per prossima curva semplice + dStartPar += 1 ; + } + return true ; + } + + // se lineare con lato obbligato... if ( nType == APL_LEFT || nType == APL_LEFT_CONVEX || nType == APL_RIGHT || nType == APL_RIGHT_CONVEX) { - // prima approssimazione lineare a 10 * Epsilon - if ( ! ApproxWithLines( 10 * EPS_SMALL, dAngTolDeg, APL_STD, PL)) + // prima approssimazione lineare a 10 * Epsilon + if ( ! ApproxWithLines( 10 * EPS_SMALL, dAngTolDeg, APL_SPECIAL, PL)) return false ; // eliminazione dei punti in tolleranza andando solo dalla parte ammessa Vector3d vtExtr = ( m_VtExtr.IsSmall() ? Z_AX : m_VtExtr) ; - if ( ! PL.ApproxOnSide( vtExtr, ( nType == APL_LEFT), dLinTol)) + if ( ! PL.ApproxOnSide( vtExtr, ( nType == APL_LEFT || nType == APL_LEFT_CONVEX), dLinTol)) return false ; // se necessario, sistemo per convessitā dalla parte ammessa if ( nType == APL_RIGHT_CONVEX || nType == APL_LEFT_CONVEX) { @@ -1273,27 +1297,12 @@ CurveComposite::ApproxWithLines( double dLinTol, double dAngTolDeg, int nType, P return true ; } - // eseguo approssimazione - double dStartPar = 0 ; - for ( auto& pCrv : m_CrvSmplS) { - // assegno estrusione e spessore della curva composita - pCrv->SetExtrusion( m_VtExtr) ; - pCrv->SetThickness( m_dThick) ; - // recupero approssimazione per curva semplice - PolyLine PLSmpl ; - if ( ! pCrv->ApproxWithLines( dLinTol, dAngTolDeg, nType, PLSmpl)) - return false ; - // ripristino estrusione e spessore della curva semplice (annullandoli) - pCrv->SetExtrusion( V_NULL) ; - pCrv->SetThickness( 0) ; - // la accodo opportunamente a quella della curva composita - if ( ! PL.Join( PLSmpl, dStartPar)) - return false ; - // incremento inizio parametro per prossima curva semplice - dStartPar += 1 ; - } - - return true ; + // altrimenti standard + // prima approssimazione lineare a 10 * Epsilon di ogni singola entitā + if ( ! ApproxWithLines( 10 * EPS_SMALL, dAngTolDeg, APL_SPECIAL, PL)) + return false ; + // eliminazione dei punti in tolleranza + return PL.RemoveAlignedPoints( dLinTol) ; } //---------------------------------------------------------------------------- diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index ed529c4..fca4212 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/IntersCurveCurve.cpp b/IntersCurveCurve.cpp index 089a18a..6614430 100644 --- a/IntersCurveCurve.cpp +++ b/IntersCurveCurve.cpp @@ -52,7 +52,7 @@ IntersCurveCurve::IntersCurveCurve( const ICurve& CurveA, const ICurve& CurveB, m_pCurve[i]->GetType() == CRV_BEZ) { // approssimo con rette PolyLine PL ; - if ( ! m_pCurve[i]->ApproxWithLines( EPS_SMALL, ANG_TOL_STD_DEG, ICurve::APL_STD, PL)) + if ( ! m_pCurve[i]->ApproxWithLines( EPS_SMALL, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL)) return ; pTmpCrv[i].Set( CreateBasicCurveComposite()) ; if ( IsNull( pTmpCrv[i])) @@ -635,7 +635,7 @@ bool IntersCurveCurve::GetCurveOutClass( const ICurve* pCurve, int& nClass) { PolyLine PL ; - if ( ! pCurve->ApproxWithLines( LIN_TOL_APPROX, ANG_TOL_APPROX_DEG, ICurve::APL_STD, PL)) + if ( ! pCurve->ApproxWithLines( LIN_TOL_APPROX, ANG_TOL_APPROX_DEG, ICurve::APL_SPECIAL, PL)) return false ; double dArea ; if ( ! PL.GetAreaXY( dArea)) diff --git a/OutTsc.cpp b/OutTsc.cpp index 4a5f41e..4941432 100644 --- a/OutTsc.cpp +++ b/OutTsc.cpp @@ -478,7 +478,7 @@ OutTsc::PutCurve( const ICurve* pCurve, int nFlag) Point3d ptIni ; Point3d ptFin ; PolyLine PL ; - pCurve->ApproxWithLines( 0.1, 5, ICurve::APL_STD, PL) ; + pCurve->ApproxWithLines( 0.1, 5, ICurve::APL_SPECIAL, PL) ; for ( bool bFound = PL.GetFirstLine( ptIni, ptFin) ; bFound ; bFound = PL.GetNextLine( ptIni, ptFin)) Line2P( ptIni, ptFin) ; diff --git a/PolyLine.cpp b/PolyLine.cpp index 0a8098e..63af6b2 100644 --- a/PolyLine.cpp +++ b/PolyLine.cpp @@ -18,6 +18,7 @@ #include "IntersLineLine.h" #include "PolygonPlane.h" #include "PointsPCA.h" +#include "GeoConst.h" #include "/EgtDev/Include/EGkPolyLine.h" #include "/EgtDev/Include/EGkPlane3d.h" #include "/EgtDev/Include/EGnStringUtils.h" @@ -670,8 +671,10 @@ PolyLine::RemoveAlignedPoints( double dToler) // se non ci sono almeno 3 punti, esco subito if ( m_lUPoints.size() < 3) return true ; + // controllo minimo valore di tolleranza + dToler = max( dToler, LIN_TOL_MIN) ; // coefficiente deduzione tolleranza - const double COEFF_TOL = 0.7 ; + const double COEFF_TOL = 0.90 ; // si analizza la distanza di un punto dal segmento che unisce precente e successivo // punto precedente auto precP = m_lUPoints.begin() ; diff --git a/SelfIntersCurve.cpp b/SelfIntersCurve.cpp index 64fb839..880741b 100644 --- a/SelfIntersCurve.cpp +++ b/SelfIntersCurve.cpp @@ -49,7 +49,7 @@ SelfIntersCurve::SelfIntersCurve( const ICurve& Curve) m_pCurve->GetType() == CRV_BEZ) { // approssimo con rette PolyLine PL ; - if ( ! m_pCurve->ApproxWithLines( EPS_SMALL, ANG_TOL_STD_DEG, ICurve::APL_STD, PL)) + if ( ! m_pCurve->ApproxWithLines( EPS_SMALL, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL)) return ; pTmpCrv.Set( CreateBasicCurveComposite()) ; if ( IsNull( pTmpCrv)) diff --git a/StmFromCurves.cpp b/StmFromCurves.cpp index 634ec8b..c56451a 100644 --- a/StmFromCurves.cpp +++ b/StmFromCurves.cpp @@ -33,7 +33,7 @@ GetSurfTriMeshByFlatContour( const ICurve* pCurve, double dLinTol) return nullptr ; // calcolo la polilinea che approssima la curva PolyLine PL ; - if ( ! pCurve->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_STD, PL)) + if ( ! pCurve->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL)) return nullptr ; // creo e setto la superficie trimesh PtrOwner pSTM( CreateSurfTriMesh()) ; @@ -77,7 +77,7 @@ GetSurfTriMeshByExtrusion( const ICurve* pCurve, const Vector3d& vtExtr, return nullptr ; // calcolo la polilinea che approssima la curva PolyLine PL ; - if ( ! pCurve->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_STD, PL)) + if ( ! pCurve->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL)) return nullptr ; // se richiesta chiusura agli estremi bool bDoCapEnds = false ; @@ -196,7 +196,7 @@ GetSurfTriMeshByRevolve( const ICurve* pCurve, const Point3d& ptAx, const Vector dLinTol = max( dLinTol, EPS_SMALL) ; // calcolo la polilinea che approssima la curva PolyLine PL ; - if ( ! pCurve->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_STD, PL)) + if ( ! pCurve->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL)) return nullptr ; // calcolo lo step di rotazione double dMaxRad = 0 ; @@ -259,7 +259,7 @@ GetSurfTriMeshByScrewing( const ICurve* pCurve, const Point3d& ptAx, const Vecto dLinTol = max( dLinTol, EPS_SMALL) ; // calcolo la polilinea che approssima la curva PolyLine PL ; - if ( ! pCurve->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_STD, PL)) + if ( ! pCurve->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL)) return nullptr ; // calcolo lo step di rotazione double dMaxRad = 0 ; @@ -291,7 +291,7 @@ GetSurfTriMeshRuled( const Point3d& ptP, const ICurve* pCurve, double dLinTol) return nullptr ; // calcolo la polilinea che approssima la curva PolyLine PL ; - if ( ! pCurve->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_STD, PL)) + if ( ! pCurve->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL)) return nullptr ; // creo e setto la superficie trimesh PtrOwner pSTM( CreateSurfTriMesh()) ; @@ -312,11 +312,11 @@ GetSurfTriMeshRuled( const ICurve* pCurve1, const ICurve* pCurve2, double dLinTo return nullptr ; // calcolo la polilinea che approssima la prima curva PolyLine PL1 ; - if ( ! pCurve1->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_STD, PL1)) + if ( ! pCurve1->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL1)) return nullptr ; // calcolo la polilinea che approssima la seconda curva PolyLine PL2 ; - if ( ! pCurve2->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_STD, PL2)) + if ( ! pCurve2->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL2)) return nullptr ; // creo e setto la superficie trimesh PtrOwner pSTM( CreateSurfTriMesh()) ; @@ -337,7 +337,7 @@ CalcRegionPolyLines( const CICURVEPVECTOR& vpCurve, double dLinTol, POLYLINEVECTOR vPLtmp ; vPLtmp.resize( vpCurve.size()) ; for ( int i = 0 ; i < int( vpCurve.size()) ; ++ i) { - if ( ! vpCurve[i]->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_STD, vPLtmp[i])) + if ( ! vpCurve[i]->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, vPLtmp[i])) return nullptr ; } // ne calcolo l'area e genero un ordine in senso decrescente