diff --git a/CurveAux.cpp b/CurveAux.cpp index b72ff1c..938a5e3 100644 --- a/CurveAux.cpp +++ b/CurveAux.cpp @@ -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 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 pCCBezier( CreateCurveComposite()) ; for ( int i = 0 ; i < int( pCC->GetCurveCount()) ; ++i) { PtrOwner 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 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 pBezCubics( CreateCurveComposite()) ; pBezCubics->AddCurve( ApproxBezierWithCubics(pCrvBezier, dTol)) ; - if( IsNull( pBezCubics)) + if ( IsNull( pBezCubics)) return nullptr ; // adatto ogni sottocurva cubica PtrOwner 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 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 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) { diff --git a/CurveComposite.cpp b/CurveComposite.cpp index 9f1d5c2..3c1dde1 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -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 pNewCrv( ArcToBezierCurve( GetCurveArc(*Iter))) ; + PtrOwner pNewCrv( ArcToBezierCurve( GetCurveArc( *Iter))) ; if ( IsNull( pNewCrv)) return false ; // se risultato è singola curva diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 4d3eb5c..38cd294 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ