EgtGeomKernel 2.7i4 :
- eliminato memory leak in ArcToBezierCurve - altre piccole modifiche stilistiche.
This commit is contained in:
+32
-33
@@ -545,7 +545,7 @@ ArcToBezierCurve( const ICurveArc* pArc, int nDeg, bool bMakeRatOrNot)
|
||||
if ( IsNull( pCrvBez) || ! pCrvBez->FromArc( *pArc))
|
||||
return nullptr ;
|
||||
// aumento il grado della curva come richiesto
|
||||
while( pCrvBez->GetDegree() < nDeg)
|
||||
while ( pCrvBez->GetDegree() < nDeg)
|
||||
pCrvBez.Set( BezierIncreaseDegree( pCrvBez)) ;
|
||||
// restituisco la curva
|
||||
return Release( pCrvBez) ;
|
||||
@@ -558,20 +558,18 @@ ArcToBezierCurve( const ICurveArc* pArc, int nDeg, bool bMakeRatOrNot)
|
||||
return nullptr ;
|
||||
// inserisco nella CC le curve di Bezier equivalenti alle parti dell'arco
|
||||
int nParts = (int) ceil( abs( pArc->GetAngCenter()) / ( BEZARC_ANG_CEN_MAX + EPS_ANG_SMALL)) ;
|
||||
//if ( ! bDeg3OrDeg2 && abs( pArc->GetDeltaN()) > EPS_ZERO)
|
||||
// nParts *= 2 ;
|
||||
nParts = max( nParts, 2) ;
|
||||
for ( int i = 0 ; i < nParts ; ++ i) {
|
||||
// copio l'arco originale
|
||||
CurveArc cArc = *GetBasicCurveArc(pArc->Clone()) ;
|
||||
CurveArc cArc = *GetBasicCurveArc( pArc) ;
|
||||
// lo limito alla parte di interesse
|
||||
cArc.TrimStartEndAtParam( i / double( nParts), ( i + 1) / double( nParts)) ;
|
||||
cArc.TrimStartEndAtParam( double( i) / nParts, double( i + 1) / nParts) ;
|
||||
// creo la curva di Bezier equivalente
|
||||
PtrOwner<ICurveBezier> pCrvBez( CreateBasicCurveBezier()) ;
|
||||
if ( IsNull( pCrvBez) || ! pCrvBez->FromArc( cArc))
|
||||
return nullptr ;
|
||||
// aumento il grado della curva come richiesto
|
||||
while( pCrvBez->GetDegree() < nDeg)
|
||||
while ( pCrvBez->GetDegree() < nDeg)
|
||||
pCrvBez.Set( BezierIncreaseDegree( pCrvBez)) ;
|
||||
// aggiungo la curva di Bezier a quella composita
|
||||
if ( ! pCrvCompo->AddCurve( Release( pCrvBez)))
|
||||
@@ -589,11 +587,11 @@ ArcToBezierCurve( const ICurveArc* pArc, int nDeg, bool bMakeRatOrNot)
|
||||
ICurve*
|
||||
CompositeToBezierCurve( const ICurveComposite* pCC, int nDeg, bool bMakeRatOrNot)
|
||||
{
|
||||
// verifico che esista la curva
|
||||
// verifico che esista la curva
|
||||
if ( pCC == nullptr)
|
||||
return nullptr ;
|
||||
|
||||
// converto tutte le curve in bezier razionali di grado 2
|
||||
// converto tutte le curve in bezier razionali di grado 2
|
||||
PtrOwner<ICurveComposite> pCCBezier( CreateCurveComposite()) ;
|
||||
for ( int i = 0 ; i < int( pCC->GetCurveCount()) ; ++i) {
|
||||
PtrOwner<ICurve> pCrvNew ;
|
||||
@@ -602,7 +600,7 @@ CompositeToBezierCurve( const ICurveComposite* pCC, int nDeg, bool bMakeRatOrNot
|
||||
ICurve* pCrvBezier = ArcToBezierCurve( crArc) ;
|
||||
if ( pCrvBezier == nullptr)
|
||||
return nullptr ;
|
||||
// se la curva è di grado superiore al secondo allora devo ricondurla al secondo grado
|
||||
// se la curva è di grado superiore al secondo allora devo ricondurla al secondo grado
|
||||
pCrvNew.Set( pCrvBezier) ;
|
||||
}
|
||||
else if ( pCC->GetCurve(i)->GetType() == CRV_LINE) {
|
||||
@@ -631,29 +629,28 @@ EditBezierCurve( const ICurveBezier* pCrvBezier, int nDeg, bool bMakeRatOrNot, d
|
||||
{
|
||||
// se nDeg == -1 allora viene mantenuto il grado della curva originale
|
||||
|
||||
// verifico sia una bezier
|
||||
// verifico sia una bezier
|
||||
if ( pCrvBezier == nullptr)
|
||||
return nullptr ;
|
||||
|
||||
if( nDeg == 2 || nDeg == 1)
|
||||
if ( nDeg == 2 || nDeg == 1)
|
||||
return nullptr ;
|
||||
|
||||
PtrOwner<ICurveBezier> pCrvNew( pCrvBezier->Clone()) ;
|
||||
int nDegCurr = pCrvNew->GetDegree() ;
|
||||
bool bRat = pCrvNew->IsRational() ;
|
||||
int nDegWanted = nDeg == -1 ? nDegCurr : nDeg ;
|
||||
if( ! bMakeRatOrNot) {
|
||||
if( ! pCrvNew->MakeNonRational( dTol)) {
|
||||
if ( ! bMakeRatOrNot) {
|
||||
if ( ! pCrvNew->MakeNonRational( dTol)) {
|
||||
// se ho fallito la conversione diretta in curva non razionale allora la spezzo in bezier cubiche
|
||||
PtrOwner<ICurveComposite> pBezCubics( CreateCurveComposite()) ;
|
||||
pBezCubics->AddCurve( ApproxBezierWithCubics(pCrvBezier, dTol)) ;
|
||||
if( IsNull( pBezCubics))
|
||||
if ( IsNull( pBezCubics))
|
||||
return nullptr ;
|
||||
// adatto ogni sottocurva cubica
|
||||
PtrOwner<ICurveComposite> pCCEdited( CreateCurveComposite()) ;
|
||||
|
||||
for ( int i = 0 ; i < pBezCubics->GetCurveCount() ; ++i) {
|
||||
if( ! pCCEdited->AddCurve( EditBezierCurve( GetCurveBezier( pBezCubics->GetCurve( i)), nDegWanted, bMakeRatOrNot, dTol)) )
|
||||
if ( ! pCCEdited->AddCurve( EditBezierCurve( GetCurveBezier( pBezCubics->GetCurve( i)), nDegWanted, bMakeRatOrNot, dTol)) )
|
||||
return nullptr ;
|
||||
}
|
||||
return Release( pCCEdited) ;
|
||||
@@ -672,7 +669,7 @@ EditBezierCurve( const ICurveBezier* pCrvBezier, int nDeg, bool bMakeRatOrNot, d
|
||||
else if ( nDegCurr > nDegWanted) {
|
||||
while ( nDegCurr > nDegWanted) {
|
||||
ICurveBezier* pCrvDec = BezierDecreaseDegree( pCrvNew, dTol) ;
|
||||
if( pCrvDec == nullptr || ! pCrvDec->IsValid()) {
|
||||
if ( pCrvDec == nullptr || ! pCrvDec->IsValid()) {
|
||||
// se ho fallito la riduzione di grado entro la tolleranza richiesta allora la spezzo in bezier cubiche prima di adattare
|
||||
PtrOwner<ICurveComposite> pBezCubics( CreateCurveComposite()) ;
|
||||
pBezCubics->AddCurve( ApproxBezierWithCubics(pCrvBezier, dTol)) ;
|
||||
@@ -698,20 +695,22 @@ EditBezierCurve( const ICurveBezier* pCrvBezier, int nDeg, bool bMakeRatOrNot, d
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
ICurveBezier*
|
||||
BezierIncreaseDegree(const ICurveBezier* pCrvBezier)
|
||||
BezierIncreaseDegree( const ICurveBezier* pCrvBezier)
|
||||
{
|
||||
if ( pCrvBezier == nullptr)
|
||||
return nullptr ;
|
||||
// creo la versione con grado aumentato
|
||||
// creo la versione con grado aumentato
|
||||
PtrOwner<ICurveBezier> pNewBezier( CreateCurveBezier()) ;
|
||||
int nDeg = pCrvBezier->GetDegree() + 1;
|
||||
bool bRat = pCrvBezier->IsRational();
|
||||
pNewBezier->Init( nDeg , bRat) ;
|
||||
// prev e curr sono riferiti alla curva di partenza
|
||||
// salvo il primo punto
|
||||
if ( IsNull( pNewBezier))
|
||||
return nullptr ;
|
||||
int nDeg = pCrvBezier->GetDegree() + 1 ;
|
||||
bool bRat = pCrvBezier->IsRational() ;
|
||||
pNewBezier->Init( nDeg, bRat) ;
|
||||
// prev e curr sono riferiti alla curva di partenza
|
||||
// salvo il primo punto
|
||||
Point3d ptCtrlPrev = pCrvBezier->GetControlPoint( 0) ;
|
||||
double dWprev = 1 ;
|
||||
if ( bRat ) {
|
||||
if ( bRat) {
|
||||
dWprev = pCrvBezier->GetControlWeight( 0) ;
|
||||
pNewBezier->SetControlPoint( 0, ptCtrlPrev, dWprev) ;
|
||||
}
|
||||
@@ -720,26 +719,26 @@ BezierIncreaseDegree(const ICurveBezier* pCrvBezier)
|
||||
// ciclo sui punti di controllo intermedi per calcolare quelli nuovi
|
||||
Point3d ptCtrlCurr ;
|
||||
double dWcurr ;
|
||||
for ( double i = 1 ; i < nDeg ; ++i) {
|
||||
ptCtrlCurr = pCrvBezier->GetControlPoint( int( i)) ;
|
||||
double dAlpha = i / nDeg ;
|
||||
for ( int i = 1 ; i < nDeg ; ++i) {
|
||||
ptCtrlCurr = pCrvBezier->GetControlPoint( i) ;
|
||||
double dAlpha = double( i) / nDeg ;
|
||||
if ( bRat) {
|
||||
dWcurr = pCrvBezier->GetControlWeight( int( i)) ;
|
||||
dWcurr = pCrvBezier->GetControlWeight( i) ;
|
||||
double dWnew = dAlpha * dWprev + ( 1 - dAlpha) * dWcurr ;
|
||||
Point3d ptNew = dAlpha * ptCtrlPrev * dWprev + ( 1 - dAlpha) * ptCtrlCurr * dWcurr;
|
||||
ptNew /= dWnew ;
|
||||
pNewBezier->SetControlPoint( int( i), ptNew, dWnew) ;
|
||||
pNewBezier->SetControlPoint( i, ptNew, dWnew) ;
|
||||
dWprev = dWcurr ;
|
||||
}
|
||||
else {
|
||||
Point3d ptNew = dAlpha * ptCtrlPrev + ( 1 - dAlpha) * ptCtrlCurr ;
|
||||
pNewBezier->SetControlPoint( int( i), ptNew) ;
|
||||
pNewBezier->SetControlPoint( i, ptNew) ;
|
||||
}
|
||||
ptCtrlPrev = ptCtrlCurr ;
|
||||
}
|
||||
// salvo l'ultimo punto
|
||||
ptCtrlCurr = pCrvBezier->GetControlPoint( nDeg - 1) ;
|
||||
if ( bRat ) {
|
||||
if ( bRat) {
|
||||
dWcurr = pCrvBezier->GetControlWeight( nDeg - 1) ;
|
||||
pNewBezier->SetControlPoint( nDeg, ptCtrlCurr, dWcurr) ;
|
||||
}
|
||||
@@ -1290,7 +1289,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( GetCurveArc(pCrv)) ;
|
||||
return ArcToBezierCurve( GetCurveArc( pCrv)) ;
|
||||
}
|
||||
// se curva composita, devo trasformarla in composita senza archi
|
||||
else if ( pCrv->GetType() == CRV_COMPO) {
|
||||
|
||||
+1
-1
@@ -3046,7 +3046,7 @@ CurveComposite::ArcsToBezierCurves( void)
|
||||
// se arco, devo trasformare in una o più curve di Bezier
|
||||
if ( (*Iter)->GetType() == CRV_ARC) {
|
||||
// eseguo trasformazione
|
||||
PtrOwner<ICurve> pNewCrv( ArcToBezierCurve( GetCurveArc(*Iter))) ;
|
||||
PtrOwner<ICurve> pNewCrv( ArcToBezierCurve( GetCurveArc( *Iter))) ;
|
||||
if ( IsNull( pNewCrv))
|
||||
return false ;
|
||||
// se risultato è singola curva
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user