EgtGeomKernel :
- correzione alla conversione di nurbs periodiche.
This commit is contained in:
+27
-11
@@ -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 ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user