diff --git a/CurveAux.cpp b/CurveAux.cpp index 4c6d624..983eb8a 100644 --- a/CurveAux.cpp +++ b/CurveAux.cpp @@ -535,6 +535,8 @@ NurbsCurveCanonicalize( CNurbsData& cnData) } } if ( ! bRepetead){ + // 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 if ( ! AreSamePointApprox( cnData.vCP[0], cnData.vCP.back()) ) { cnData.vCP.push_back( cnData.vCP[0]) ; @@ -545,7 +547,36 @@ NurbsCurveCanonicalize( CNurbsData& cnData) if ( int( cnData.vU.size()) != int(cnData.vCP.size()) + cnData.nDeg - 1) { // devo poi anche togliere i nodi di troppo // presuppongo che la convenzione sia che i nodi di troppo sono alla fine del vettore dei nodi cnData.vU = DBLVECTOR( cnData.vU.begin(), cnData.vU.end() - cnData.nDeg) ; - // controlloeventualmente anche i nodi extra + // 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 + 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) + cnData.vU = vector( cnData.vU.begin() + 1, cnData.vU.end()) ; + } + // controllo se il vettore dei nodi ha la giusta molteplicità all'inizio e alla fine, sennò ha comunque bisogno di essere resa non periodica + 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 ; + } + else { + // aggiungo i punti ripetuti ( il primo l'ho già aggiunto) + for ( int i = 1 ; i < cnData.nDeg ; ++i ) { + cnData.vCP.push_back( cnData.vCP[i]) ; + if ( cnData.bRat) + cnData.vW.push_back( cnData.vW[i]) ; + } + // recupero il vettore dei nodi + cnData.vU = vU ; + // verifico se ho 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 cnData.vU = vector( cnData.vU.begin() + 1, cnData.vU.end() - 1) ; @@ -553,8 +584,6 @@ NurbsCurveCanonicalize( CNurbsData& cnData) else if ( cnData.vU.size() == int( cnData.vCP.size()) + cnData.nDeg) cnData.vU = vector( cnData.vU.begin() + 1, cnData.vU.end()) ; } - cnData.bPeriodic = false ; - return true ; } }