//---------------------------------------------------------------------------- // EgalTech 2014-2014 //---------------------------------------------------------------------------- // File : EGkCurveAux.h Data : 28.01.24 Versione : 2.6a2 // Contenuto : Dichiarazione funzioni ausiliarie per ICurve. // // // // Modifiche : 23.05.14 DS Creazione modulo. // // //---------------------------------------------------------------------------- #pragma once #include "/EgtDev/Include/EGkCurveComposite.h" class ICurveBezier ; class ICurveLine ; class ICurveArc ; class ICurveComposite ; //----------------------- Macro per import/export ---------------------------- #undef EGK_EXPORT #if defined( I_AM_EGK) // da definirsi solo nella DLL #define EGK_EXPORT __declspec( dllexport) #else #define EGK_EXPORT __declspec( dllimport) #endif //---------------------------------------------------------------------------- //! Struttura dati per curva Nurbs struct CNurbsData { int nDeg ; // grado bool bRat ; // flag di curva razionale (pesi non tutti unitari) bool bPeriodic ; // flag per segnalare vettore dei nodi periodico bool bClosed ; // flag di curva chiusa bool bClamped ; // flag di curva clamped bool bExtraKnotes ; // flag per segnalare presenza di nodi extra all'inizio e fine (totale 2) DBLVECTOR vU ; // vettore dei nodi PNTVECTOR vCP ; // vettore dei punti di controllo DBLVECTOR vW ; // vettore dei pesi CNurbsData( void) : nDeg( 0), bRat( false), bPeriodic( false), bClosed( false), bClamped( true), bExtraKnotes(false) {} } ; // N.B. : in caso la curva sia razionale i punti di controllo sono in forma NON OMOGENEA [ x, y, z, w] ( dove la forma OMOGENEA � [ w*x, w*y, w*z, w]) // tutte le operazioni richiedono la forma OMOGENEA, finite le quali posso riportarmi alla forma NON OMOGENEA //---------------------------------------------------------------------------- //! Trasforma una curva in una nuova curva di Bezier semplice EGK_EXPORT ICurve* CurveToBezierCurve( const ICurve* pCrv, int nDeg = 3, bool bMakeRatOrNot = false) ; //---------------------------------------------------------------------------- //! Trasforma una linea in una nuova curva di Bezier semplice EGK_EXPORT ICurveBezier* LineToBezierCurve( const ICurveLine* pCrvLine, int nDeg = 3, bool bMakeRatOrNot = false) ; //---------------------------------------------------------------------------- //! Trasforma un arco in una nuova curva di Bezier semplice o composta EGK_EXPORT ICurve* ArcToBezierCurve( const ICurveArc* pArc, int nDeg = 3, bool bMakeRatOrNot = true) ; //---------------------------------------------------------------------------- //! Trasforma una curva compo in una nuova curva di Bezier semplice o composta EGK_EXPORT ICurve* CompositeToBezierCurve( const ICurveComposite* pCrv, int nDeg = 3, bool bMakeRatOrNot = false) ; //---------------------------------------------------------------------------- //! Trasforma una curva bezier in una nuova curva di Bezier semplice o composta della razionalit� e grado desiderato ( minimo 3) EGK_EXPORT ICurve* EditBezierCurve( const ICurveBezier* pCrv, int nDeg = 3, bool bMakeRatOrNot = false, double dTol = 10 * EPS_SMALL) ; //---------------------------------------------------------------------------- //! Approssima una bezier con una serie di bezier cubiche EGK_EXPORT ICurve* ApproxBezierWithCubics( const ICurve* pCrv, double dTol) ; //---------------------------------------------------------------------------- //! Approssima una bezier con una serie di bezier cubiche EGK_EXPORT ICurveBezier* ApproxArcCurveBezierWithSingleCubic( const ICurve* pCrv, const Point3d& ptCen, const Vector3d& vtN) ; //---------------------------------------------------------------------------- //! Campiona una serie di punti dalla curva e li approssima con una o pi� curve di bezier EGK_EXPORT ICurve* ApproxCurveWithBezier( const ICurve* pCrv, double dTol, const Vector3d& vtStart = V_NULL, const Vector3d& vtEnd = V_NULL) ; //---------------------------------------------------------------------------- //! Interpola un set di punti e li approssima con una o pi� curve di bezier cubiche EGK_EXPORT ICurve* InterpolatePointSetWithBezier( const PNTVECTOR& vPnt, double dLinTol, double dMaxLen) ; //---------------------------------------------------------------------------- //! Aumento il grado della curva di Bezier EGK_EXPORT ICurveBezier* BezierIncreaseDegree( const ICurveBezier* pCrvBezier) ; //---------------------------------------------------------------------------- //! Riduco il grado della curva di Bezier EGK_EXPORT ICurveBezier* BezierDecreaseDegree( const ICurveBezier* pCrvBezier, double dTol) ; //---------------------------------------------------------------------------- //! Misura l'errore di approsimazione tra la curva originale e quella modificata EGK_EXPORT bool CalcApproxError( const ICurve* pCrvOri, const ICurve* pCrvNew, double& dErr, int nPoints = 20) ; //---------------------------------------------------------------------------- //! Trasforma una curva in una nuova curva semplice o composta senza archi (solo linee o curve di Bezier) EGK_EXPORT ICurve* CurveToNoArcsCurve( const ICurve* pCrv) ; //---------------------------------------------------------------------------- //! Trasformo una curva in una nuova curva semplice o composta con linee o archi perp. a estrusione EGK_EXPORT ICurve* CurveToArcsPerpExtrCurve( const ICurve* pCrv, double dLinTol, double dAngTolDeg) ; //---------------------------------------------------------------------------- //! Rende canonica la rappresentazione della curva Nurbs EGK_EXPORT bool NurbsCurveCanonicalize( CNurbsData& cnData) ; //---------------------------------------------------------------------------- //! Trasforma una curva Nurbs standard in una nuova curva di Bezier semplice o composta EGK_EXPORT ICurve* NurbsToBezierCurve( const CNurbsData& cnData) ; //---------------------------------------------------------------------------- //! Appiattisce la curva sul suo piano medio se rientra nelle tolleranze const int FLTCRV_STD = 0 ; const int FLTCRV_USE_EXTR = 1 ; const int FLTCRV_SET_EXTR = 2 ; EGK_EXPORT ICurve* FlattenCurve( const ICurve& crCrv, double dToler, double dAngToler, int nFlag = FLTCRV_STD) ; //---------------------------------------------------------------------------- //! Proietta la curva sul piano indicato EGK_EXPORT ICurve* ProjectCurveOnPlane( const ICurve& crCrv, const Plane3d& plPlane) ; //---------------------------------------------------------------------------- //! Uniforma la pendenza di una composita tra quota iniziale e finale assegnate EGK_EXPORT bool AdjustCurveSlope( ICurveComposite* pCrv, double dNini, double dNfin) ; //---------------------------------------------------------------------------- //! Calcolo del diagramma di Voronoi della curva/e, nei TempParam dei risultati la distanza //! Per nBound tenere valore di default. EGK_EXPORT bool CalcCurveVoronoiDiagram( const ICurve& crvC, ICURVEPOVECTOR& vCrvs, int nBound = 3) ; EGK_EXPORT bool CalcCurvesVoronoiDiagram( const CICURVEPVECTOR& vCrvC, ICURVEPOVECTOR& vCrvs, int nBound = 3) ; //---------------------------------------------------------------------------- //! Calcolo del Medial Axis della curva/e (sottoinsieme del diagramma di Voronoi), nei TempParam dei risultati la distanza const int WMAT_BOTHSIDES = 0 ; const int WMAT_LEFT = 1 ; const int WMAT_RIGHT = 2 ; EGK_EXPORT bool CalcCurveMedialAxis( const ICurve& crvC, ICURVEPOVECTOR& vCrvs, int nSide) ; EGK_EXPORT bool CalcCurvesMedialAxis( const CICURVEPVECTOR& vCrvC, ICURVEPOVECTOR& vCrvs, int nSide) ; //---------------------------------------------------------------------------- //! Calcola l'offset completo di una curva EGK_EXPORT bool CalcCurveFatCurve( const ICurve& crvC, ICURVEPOVECTOR& vCrvs, double dRadius, bool bSquareEnds, bool bSquareMids, bool bMergeOnlySameProps = true) ; //---------------------------------------------------------------------------- //! Calcola, nel caso di curve chiuse, il valore limite di offset ( in valore assoluto) che fa sparire la curva EGK_EXPORT bool CalcCurveLimitOffset( const ICurve& crvC, double& dOffs) ; //---------------------------------------------------------------------------- //! Calcola, se possibile, le curve di offset del valore richiesto come curve singole EGK_EXPORT bool CalcCurveSingleCurvesOffset( const ICurve& crvC, ICURVEPOVECTOR& vCrvs, double dOffs) ; //---------------------------------------------------------------------------- //! Calcola, se possibile, le curve di offset dato un vettore di curve aperte/chiuse EGK_EXPORT bool CalcOffsetCurves( const ICURVEPVECTOR& vpCrvs, ICURVEPOVECTOR& vCrvs, double dOffs, int nType = ICurve::OFF_FILLET) ; //---------------------------------------------------------------------------- //! Calcola, se possibile, le fat curve di offset dato un vettore di curve aperte/chiuse EGK_EXPORT bool CalcFatOffsetCurves( const ICURVEPVECTOR& vpCrvs, ICURVEPOVECTOR& vCrvs, double dOffs, bool bSquareEnds, bool bSquareMids, bool bMergeOnlySameProps = true) ; //---------------------------------------------------------------------------- //! Resetta l'oggetto voronoi associato alla curva liberandone la memoria EGK_EXPORT void ResetCurveVoronoi( const ICurve& crvC) ; //---------------------------------------------------------------------------- //! fa il join delle curve passate in input EGK_EXPORT bool GetChainedCurves( ICRVCOMPOPOVECTOR& vCrv, double dChainTol = 5 * EPS_SMALL, bool bAllowInvert = false) ; //---------------------------------------------------------------------------- //! dato un punto su una curva trova il corrispondente sulla seconda curva EGK_EXPORT bool GetIsoPointOnSecondCurve( const ICurve* pCrv1, const ICurve* pCrv2, double dUCurr1, double& dUCurr2, double dMyDist, double dUPrev2, double dLenPrev2, double& dLenCurr2, double dLen2) ;