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 b9bac347e8
commit f08dee836b
2 changed files with 37 additions and 6 deletions
+10 -4
View File
@@ -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] ;
}