EgtGeomKernel :

- correzione alla conversione di nurbs periodiche.
This commit is contained in:
Daniele Bariletti
2024-06-11 15:55:56 +02:00
parent c637ccec47
commit 36ce855ef3
+27 -11
View File
@@ -858,9 +858,10 @@ NurbsCurveCanonicalize( CNurbsData& cnData)
// se periodica
if ( cnData.bPeriodic || ! cnData.bClamped) {
bool bAlreadyChecked = false ;
// 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 ) {
if ( cnData.bPeriodic && (int(cnData.vU.size()) > int(cnData.vCP.size()) + cnData.nDeg - 1)) {
bool bRepeated = true ;
for ( int i = 0 ; i < cnData.nDeg ; ++i) {
if ( ! AreSamePointApprox( cnData.vCP[i], cnData.vCP.end()[-cnData.nDeg + i]) ) {
@@ -869,7 +870,7 @@ NurbsCurveCanonicalize( CNurbsData& cnData)
}
}
bool bFirstAddedAtEnd = false ;
bool bRetryKnotsAdjust = false ;
//bool bRetryKnotsAdjust = false ;
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 ;
@@ -887,14 +888,14 @@ NurbsCurveCanonicalize( CNurbsData& cnData)
// controllo eventualmente anche i nodi extra
// se ne ho due in più ne tolgo uno in cima e uno in fondo
if ( cnData.vU.size() == int( cnData.vCP.size()) + cnData.nDeg + 1 ) { // significa che ci sono due nodi extra, uno all'inizio e uno alla fine, da togliere
if( abs( cnData.vU[0] - cnData.vU[1]) < EPS_SMALL )
bRetryKnotsAdjust = true ;
//if( abs( cnData.vU[0] - cnData.vU[1]) < EPS_SMALL )
// bRetryKnotsAdjust = true ;
cnData.vU = vector<double>( cnData.vU.begin() + 1, cnData.vU.end() - 1) ;
}
// se ne ho solo uno in più lo tolgo in cima
else if ( cnData.vU.size() == int( cnData.vCP.size()) + cnData.nDeg) {
if( abs( cnData.vU[0] - cnData.vU[1]) < EPS_SMALL )
bRetryKnotsAdjust = true ;
//if( abs( cnData.vU[0] - cnData.vU[1]) < EPS_SMALL )
// bRetryKnotsAdjust = true ;
cnData.vU = vector<double>( cnData.vU.begin() + 1, cnData.vU.end()) ;
}
}
@@ -910,8 +911,7 @@ NurbsCurveCanonicalize( CNurbsData& cnData)
cnData.bPeriodic = false ;
return true ;
}
else if ( (int(cnData.vU.size()) != int(cnData.vCP.size()) + cnData.nDeg - 1) ||
bRetryKnotsAdjust) {
else /*if ( bRetryKnotsAdjust )*/ {
// aggiungo i punti ripetuti ( controllando se il primo l'ho già aggiunto o c'è già)
bFirstAddedAtEnd = bFirstAddedAtEnd || AreSamePointApprox( cnData.vCP[0], cnData.vCP.back()) ;
for ( int i = bFirstAddedAtEnd ? 1 : 0 ; i < cnData.nDeg ; ++i ) {
@@ -936,9 +936,25 @@ NurbsCurveCanonicalize( CNurbsData& cnData)
else if ( cnData.vU.size() == int( cnData.vCP.size()) + cnData.nDeg)
cnData.vU = vector<double>( cnData.vU.begin() + 1, cnData.vU.end()) ;
}
else {
; // la nurbs è ancora periodica ma è già pronta per essere resa non periodica
}
//else {
// ; // la nurbs è ancora periodica ma è già pronta per essere resa non periodica
//}
bAlreadyChecked = true ;
}
}
if ( ! bAlreadyChecked) {
// se non ho già controllato guardo se ho già la giusta molteplicità all'inizio e alla fine del vettore dei nodi
double dU0 = cnData.vU[0] ;
double dULast = cnData.vU.back() ;
bool bSame = true ;
for ( int i = 1 ; i < cnData.nDeg ; ++i ) {
bSame = bSame && abs(cnData.vU[i] - dU0) < EPS_SMALL ;
bSame = bSame && abs(cnData.vU.end()[-( i+ 1)] - dULast) < EPS_SMALL ;
}
if ( bSame) {
cnData.bPeriodic = false ;
return true ;
}
}