942b26229f
- aggiunto prototipo.
156 lines
8.6 KiB
C++
156 lines
8.6 KiB
C++
//----------------------------------------------------------------------------
|
|
// 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 ;
|
|
|
|
//----------------------- 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 linea in una nuova curva di Bezier semplice
|
|
EGK_EXPORT ICurve* CurveToBezierCurve( const ICurve* pCrv, int nDeg = 3, bool bMakeRatOrNot = true) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! Trasforma una linea in una nuova curva di Bezier semplice
|
|
EGK_EXPORT ICurveBezier* LineToBezierCurve( const ICurveLine* pLine, int nDeg = 3, bool bMakeRatOrNot = true) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! Trasforma un arco in una nuova curva di Bezier semplice o composta
|
|
EGK_EXPORT ICurve* ArcToBezierCurve( const ICurve* 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* pCrvCompo, int nDeg = 3, bool bMakeRatOrNot = true) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! 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* pCrvBezier, int nDeg = 3, bool bMakeRatOrNot = true, double dTol = 10 * EPS_SMALL) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! Approssima una bezier con una serie di bezier cubiche
|
|
EGK_EXPORT ICurve* ApproxBezierWithCubics( const ICurveBezier* pCrvBezier, double dTol) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! Approssima una bezier con una serie di bezier cubiche
|
|
EGK_EXPORT ICurveBezier* ApproxArcCurveBezierWithSingleCubic( const ICurveBezier* pCrvBezier, const Point3d& ptCen) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! Campiona una serie di punti dalla curva e li approssima con una o più curve di bezier
|
|
EGK_EXPORT ICurve* ApproxCurveWithBezier( const ICurve*, double dTol) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! Interpola un set di punti e li approssima con una o più curve di bezier cubiche
|
|
EGK_EXPORT ICurve* InterpolatePointSetWithBezier( const PNTVECTOR& vPnt, double dTol) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! 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 CalcBezierApproxError( const ICurveBezier* pCrvOri, const ICurveBezier* 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) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! 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) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
//! Resetta l'oggetto voronoi associato alla curva liberandone la memoria
|
|
EGK_EXPORT void ResetCurveVoronoi( const ICurve& crvC) ; |