From f08dee836bd76191658a6c3fc79826ce5ba3a4cb Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Wed, 5 Jun 2024 09:10:22 +0200 Subject: [PATCH] EgtGeomKernel : - correzioni alla conversione da nurbs a bezier per curve e superfici. --- CurveAux.cpp | 14 ++++++++++---- SurfAux.cpp | 29 +++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/CurveAux.cpp b/CurveAux.cpp index 90579e7..63cc18f 100644 --- a/CurveAux.cpp +++ b/CurveAux.cpp @@ -803,14 +803,14 @@ NurbsCurveCanonicalize( CNurbsData& cnData) // se la curva รจ peridica verifco che effettivamente ci sia un numero di punti ripetituti uguale al grado della curva // wrap della curva su se stessa if ( cnData.bPeriodic ) { - bool bRepetead = true ; + bool bRepeated = true ; for ( int i = 0 ; i < cnData.nDeg ; ++i) { if ( ! AreSamePointApprox( cnData.vCP[i], cnData.vCP.end()[-cnData.nDeg + i]) ) { - bRepetead = false ; + bRepeated = false ; break ; } } - if ( ! bRepetead){ + if ( ! bRepeated || (bRepeated && AreSamePointApprox( cnData.vCP[0],cnData.vCP[cnData.nDeg]))){ // salvo il vettore dei nodi in caso mi accorga di avere tra le mani una curva unclamped DBLVECTOR vU = cnData.vU ; // se il primo e l'ultimo punto non coincidono allora aggiungo il primo punto in fondo al vettore dei punti di controllo @@ -1031,15 +1031,21 @@ NurbsCurveCanonicalize( CNurbsData& cnData) nU = nU - 2 * ( nDeg - 1); PNTVECTOR vCP_clamped ; vCP_clamped.resize( nCP) ; + DBLVECTOR vW_clamped ; + vW_clamped.resize( nCP) ; DBLVECTOR vU_clamped ; vU_clamped.resize( nU) ; for ( int i = 0 ; i < nCP ; ++i) { if ( ! cnData.bRat) vCP_clamped[i] = cnData.vCP[i + nDeg - 1] ; - else + else { + vW_clamped[i] = cnData.vW[i + nDeg - 1] ; vCP_clamped[i] = cnData.vCP[i + nDeg - 1] / cnData.vW[i + nDeg - 1] ; + } } cnData.vCP = vCP_clamped ; + cnData.vW = vW_clamped ; + for ( int i = 0 ; i < nU ; ++i) { vU_clamped[i] = cnData.vU[i + nDeg - 1] ; } diff --git a/SurfAux.cpp b/SurfAux.cpp index 4e9e612..bcdd829 100644 --- a/SurfAux.cpp +++ b/SurfAux.cpp @@ -45,6 +45,7 @@ NurbsSurfaceCanonicalize( SNurbsSurfData& snData) for( int j = 0 ; j < snData.nCPV ; ++j) { CNurbsData nuCurve ; nuCurve.bPeriodic = true ; + nuCurve.bRat = snData.bRat ; nuCurve.nDeg = snData.nDegU ; nuCurve.vU = vU ; // vettore dei punti di controllo @@ -63,13 +64,23 @@ NurbsSurfaceCanonicalize( SNurbsSurfData& snData) nuCurve.vW = vWeCtrl ; // i punti dell' oggetto nuCurve devono essere in forma non omogenea if ( NurbsCurveCanonicalize( nuCurve)) { // se NurbsCurveCanonicalize ha restituito false (la curva potrebbe esserre un punto di polo) allora non modifico i punti e il vettore dei nodi della superficie + if ( snData.mCP.size() != nuCurve.vCP.size() ) { + snData.mCP.resize( nuCurve.vCP.size()) ; + if( snData.bRat) + snData.mW.resize( nuCurve.vW.size()) ; + } for ( int i = 0 ; i < snData.nCPU ; ++i) { snData.mCP[i][j] = nuCurve.vCP[i] ; + if( snData.bRat) { + snData.mW[i][j] = nuCurve.vW[i] ; + snData.mCP[i][j] *= nuCurve.vW[i] ; + } } snData.vU = nuCurve.vU ; } } snData.bPeriodicU = false ; + snData.nCPU = int( snData.mCP.size()) ; } if ( snData.bPeriodicV || ! snData.bClampedV) { bool bIsRational = snData.bRat ; @@ -83,6 +94,7 @@ NurbsSurfaceCanonicalize( SNurbsSurfData& snData) for( int i = 0 ; i < snData.nCPU ; ++i) { CNurbsData nuCurve ; nuCurve.bPeriodic = true ; + nuCurve.bRat = snData.bRat ; nuCurve.nDeg = snData.nDegV ; nuCurve.vU = vV ; // vettore dei punti di controllo @@ -101,15 +113,28 @@ NurbsSurfaceCanonicalize( SNurbsSurfData& snData) nuCurve.vW = vWeCtrl ; // i punti dell' oggetto nuCurve devono essere in forma non omogenea if ( NurbsCurveCanonicalize( nuCurve)) { // se NurbsCurveCanonicalize ha restituito false (la curva potrebbe esserre un punto di polo) allora non modifico i punti e il vettore dei nodi della superficie - for ( int j = 0 ; j < snData.nCPV ; ++j ) { + if ( snData.mCP[i].size() != nuCurve.vCP.size()){ + snData.mCP[i].clear() ; + snData.mCP[i].resize( nuCurve.vCP.size()) ; + if ( snData.bRat ) { + snData.mW[i].clear() ; + snData.mW[i].resize( nuCurve.vW.size()) ; + } + } + for ( int j = 0 ; j < int( nuCurve.vCP.size()) ; ++j ) { snData.mCP[i][j] = nuCurve.vCP[j] ; + if ( snData.bRat ) { + snData.mW[i][j] = nuCurve.vW[j] ; + snData.mCP[i][j] *= nuCurve.vW[j] ; + } } snData.vV = nuCurve.vU ; } } snData.bPeriodicV = false ; + snData.nCPV = int( snData.mCP[0].size()) ; } - return true; + return true ; } //----------------------------------------------------------------------------