EgtGeomKernel :

- correzioni alla conversione da nurbs a bezier per curve e superfici.
This commit is contained in:
Daniele Bariletti
2024-06-05 09:10:22 +02:00
parent ac23938dd0
commit 261e9ac0c8
2 changed files with 37 additions and 6 deletions
+10 -4
View File
@@ -861,14 +861,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
@@ -1111,15 +1111,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] ;
}
+27 -2
View File
@@ -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 ;
}
//----------------------------------------------------------------------------