EgtGeomKernel :

- uniformazione delle funzioni per l'approssimazione curve con bezier.
This commit is contained in:
Daniele Bariletti
2025-08-07 11:22:20 +02:00
parent 8ee5bc74d5
commit 05c0b0a18b
2 changed files with 46 additions and 14 deletions
+45 -13
View File
@@ -513,8 +513,13 @@ CurveToBezierCurve( const ICurve* pCrv, int nDeg, bool bMakeRatOrNot)
//----------------------------------------------------------------------------
ICurveBezier*
LineToBezierCurve( const ICurveLine* pCrvLine, int nDeg, bool bMakeRatOrNot)
LineToBezierCurve( const ICurve* pCrv, int nDeg, bool bMakeRatOrNot)
{
// verifico sia una linea
const CurveLine* pCrvLine = GetBasicCurveLine( pCrv) ;
if ( pCrvLine == nullptr)
return nullptr ;
PtrOwner<ICurveBezier> pCrvBezier( CreateCurveBezier()) ;
// rendo tutte le curve di grado 2 e razionali così posso convertire anche archi e avere tutte curve dello stesso grado e razionali
pCrvBezier->Init( nDeg, true) ;
@@ -526,14 +531,14 @@ LineToBezierCurve( const ICurveLine* pCrvLine, int nDeg, bool bMakeRatOrNot)
//----------------------------------------------------------------------------
ICurve*
ArcToBezierCurve( const ICurveArc* pArc, int nDeg, bool bMakeRatOrNot)
ArcToBezierCurve( const ICurve* pCrv, int nDeg, bool bMakeRatOrNot)
{
// una spirale non può essere forzata al grado 2
//// verifico sia un arco
// const CurveArc* pArc = GetBasicCurveArc( pCrv) ;
// if ( pArc == nullptr)
// return nullptr ;
// verifico sia un arco
const CurveArc* pArc = GetBasicCurveArc( pCrv) ;
if ( pArc == nullptr)
return nullptr ;
// se angolo al centro sotto il limite, basta una curva
if ( abs( pArc->GetAngCenter()) < BEZARC_ANG_CEN_MAX + EPS_ANG_SMALL) {
@@ -584,8 +589,13 @@ ArcToBezierCurve( const ICurveArc* pArc, int nDeg, bool bMakeRatOrNot)
//----------------------------------------------------------------------------
ICurve*
CompositeToBezierCurve( const ICurveComposite* pCC, int nDeg, bool bMakeRatOrNot)
CompositeToBezierCurve( const ICurve* pCrv, int nDeg, bool bMakeRatOrNot)
{
// verifico sia una composita
const CurveComposite* pCC = GetBasicCurveComposite( pCrv) ;
if ( pCC == nullptr)
return nullptr ;
// converto tutte le curve in bezier razionali di grado 2
PtrOwner<ICurveComposite> pCCBezier( CreateCurveComposite()) ;
for ( int i = 0 ; i < int( pCC->GetCurveCount()) ; ++i) {
@@ -620,10 +630,15 @@ CompositeToBezierCurve( const ICurveComposite* pCC, int nDeg, bool bMakeRatOrNot
//----------------------------------------------------------------------------
ICurve*
EditBezierCurve( const ICurveBezier* pCrvBezier, int nDeg, bool bMakeRatOrNot, double dTol)
EditBezierCurve( const ICurve* pCrv, int nDeg, bool bMakeRatOrNot, double dTol)
{
// se nDeg == -1 allora viene mantenuto il grado della curva originale
// verifico sia una bezier
const CurveBezier* pCrvBezier = GetBasicCurveBezier( pCrv) ;
if ( pCrvBezier == nullptr)
return nullptr ;
if( nDeg == 2 || nDeg == 1)
return nullptr ;
@@ -889,8 +904,13 @@ BezierDecreaseDegree(const ICurveBezier* pCrvBezier, double dTol)
//----------------------------------------------------------------------------
ICurve*
ApproxBezierWithCubics(const ICurveBezier* pCrvBezier, double dTol)
ApproxBezierWithCubics(const ICurve* pCrv, double dTol)
{
// verifico sia una bezier
const CurveBezier* pCrvBezier = GetBasicCurveBezier( pCrv) ;
if ( pCrvBezier == nullptr)
return nullptr ;
// cerco di stimare quanti cambi di concavità ho
// tiro una linea tra il primo punto di controllo e l'ultimo e poi scorro gli altri punti di controllo
// controllando quante volte salto da un lato all'altro della linea
@@ -1012,8 +1032,13 @@ ApproxBezierWithCubics(const ICurveBezier* pCrvBezier, double dTol)
//----------------------------------------------------------------------------
ICurveBezier*
ApproxCurveBezierWithSingleCubic( const ICurveBezier* pCrvBez)
ApproxCurveBezierWithSingleCubic( const ICurve* pCrv)
{
// verifico sia una bezier
const CurveBezier* pCrvBez = GetBasicCurveBezier( pCrv) ;
if ( pCrvBez == nullptr)
return nullptr ;
Point3d ptStart, ptEnd ;
pCrvBez->GetStartPoint( ptStart) ;
pCrvBez->GetEndPoint( ptEnd) ;
@@ -1042,8 +1067,13 @@ ApproxCurveBezierWithSingleCubic( const ICurveBezier* pCrvBez)
//----------------------------------------------------------------------------
ICurveBezier*
ApproxArcCurveBezierWithSingleCubic( const ICurveBezier* pCrvBez, const Point3d& ptCen)
ApproxArcCurveBezierWithSingleCubic( const ICurve* pCrv, const Point3d& ptCen)
{
// verifico sia una bezier
const CurveBezier* pCrvBez = GetBasicCurveBezier( pCrv) ;
if ( pCrvBez == nullptr)
return nullptr ;
// converto una curva di bezier che definisce un arco perfetto di circonferenza
// dato il centro( della circonferenza), inizio e fine
// N.B. : per archi con angolo al centro < 90
@@ -1086,7 +1116,9 @@ ApproxArcCurveBezierWithSingleCubic( const ICurveBezier* pCrvBez, const Point3d&
ICurve*
ApproxCurveWithBezier( const ICurve*, double dTol)
{
// interpolazione di punti con una curva bezier
// campiono punti lungo la curva e poi li interpolo
// oppure faccio la fat curve e poi calcolo una bezier che stia all'interno di quella regione
PtrOwner<ICurveComposite> pCC( CreateBasicCurveComposite()) ;
return Release( pCC) ;
@@ -1262,7 +1294,7 @@ CurveToNoArcsCurve( const ICurve* pCrv)
return nullptr ;
// se arco, devo trasformarlo in curva di Bezier (semplice o composta)
if ( pCrv->GetType() == CRV_ARC) {
return ArcToBezierCurve( pCrv) ;
return ArcToBezierCurve( GetCurveArc(pCrv)) ;
}
// se curva composita, devo trasformarla in composita senza archi
else if ( pCrv->GetType() == CRV_COMPO) {
+1 -1
View File
@@ -33,5 +33,5 @@ bool CurveGetArea( const ICurve& crvC, Plane3d& plPlane, double& dArea) ;
bool CurveDump( const ICurve& crvC, std::string& sOut, bool bMM, const char* szNewLine) ;
bool CopyExtrusion( const ICurve* pSouCrv, ICurve* pDestCrv) ;
bool CopyThickness( const ICurve* pSouCrv, ICurve* pDestCrv) ;
ICurveBezier* ApproxCurveBezierWithSingleCubic( const ICurveBezier* pCrvBez) ;
ICurveBezier* ApproxCurveBezierWithSingleCubic( const ICurve* pCrv) ;
Voronoi* GetCurveVoronoi( const ICurve& crvC) ;