diff --git a/CurveAux.cpp b/CurveAux.cpp index e4fb728..ec97ccf 100644 --- a/CurveAux.cpp +++ b/CurveAux.cpp @@ -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( 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( 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( 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 ; } }