diff --git a/CurveAux.cpp b/CurveAux.cpp index 5e8051b..bb0d084 100644 --- a/CurveAux.cpp +++ b/CurveAux.cpp @@ -527,7 +527,7 @@ NurbsCurveCanonicalize( CNurbsData& cnData) // bisogna aumentare la molteplicità dei nodi u_p e u_(m-p) fino ad arrivare al grado della nurbs // e poi scartare nodi e punti fuori dalla regione clamped ( al di fuori della regione u_p -> u_(m-p)) - // comincio ad aumentare la molteplictià del nodo u_m-p + // comincio ad aumentare la molteplictià del nodo u_m-p+1 int nCP = int( cnData.vCP.size()) ; int nU = nCP + cnData.nDeg - 1 ; int nDeg = cnData.nDeg ; @@ -537,7 +537,7 @@ NurbsCurveCanonicalize( CNurbsData& cnData) vBW.resize( nDeg + 1) ; // trovo il nodo di cui aumentare la molteplicità e ne calcolo la molteplicità - int b = nU - nDeg - 1 ; + int b = nU - nDeg - 1 +1; int i = b ; while ( abs( cnData.vU[b] - cnData.vU[b - 1]) < EPS_ZERO) -- b ; @@ -545,24 +545,28 @@ NurbsCurveCanonicalize( CNurbsData& cnData) // recupero i punti da modificare if ( ! cnData.bRat) { for ( int i = 0 ; i <= nDeg - mult ; ++ i) - vBC[i] = cnData.vCP[b - nDeg + i] ; + vBC[i] = cnData.vCP[b - nDeg + 1 + i] ; } else { for ( int i = 0 ; i <= nDeg - mult ; ++ i) { - vBC[i] = cnData.vCP[b - nDeg + i] * cnData.vW[b - nDeg + i] ; - vBW[i] = cnData.vW[b - nDeg + i] ; + vBC[i] = cnData.vCP[b - nDeg + 1 + i] * cnData.vW[b - nDeg + 1 + i] ; + vBW[i] = cnData.vW[b - nDeg + 1 + i] ; } } + //DEBUG + PNTVECTOR vtPT_0 = cnData.vCP ; + //DEBUG + // salvo i punti inalterati int r = nDeg - mult ; // numero di volte che dovrò inserire il nodo cnData.vCP.resize( nCP + r) ; - for ( int p = b - mult ; p < nCP ; ++p) { + for ( int p = nCP - 1 ; p >= b - mult ; --p) { cnData.vCP[r + p] = cnData.vCP[p] ; } if ( cnData.bRat ) { cnData.vW.resize( nCP + r) ; - for ( int p = b - mult ; p <= nCP ; ++p) { + for ( int p = nCP - 1 ; p >= b - mult ; --p) { cnData.vW[r + p] = cnData.vW[p] ; } } @@ -600,11 +604,13 @@ NurbsCurveCanonicalize( CNurbsData& cnData) // aggiungo i punti ottenuti alla curva. for ( int p = L + 1 ; p < b - mult ; ++p) { - cnData.vCP[ b - nDeg + 1 + p] = vBC[p] ; + //cnData.vCP[ b - nDeg + 1 + p] = vBC[p-L] ; + cnData.vCP[p] = vBC[p-L] ; } if ( cnData.bRat ) { for ( int p = L + 1 ; p <= b - mult ; ++p) { - cnData.vW[ b - nDeg + 1 + p] = vBW[p] ; + //cnData.vW[ b - nDeg + 1 + p] = vBW[p-L] ; + cnData.vW[p] = vBW[p-L] ; } } @@ -626,8 +632,8 @@ NurbsCurveCanonicalize( CNurbsData& cnData) PNTVECTOR vtPT0 = cnData.vCP ; //DEBUG - // aumento la molteplicità del punto u_p - b = nDeg ; + // aumento la molteplicità del punto u_p-1 + b = nDeg -1; i = b ; while ( abs( cnData.vU[b] - cnData.vU[b - 1]) < EPS_ZERO) -- b ; @@ -647,13 +653,13 @@ NurbsCurveCanonicalize( CNurbsData& cnData) r = nDeg - mult ; // salvo i punti inalterati cnData.vCP.resize( nCP + r) ; - for ( int p = b - mult ; p < nCP ; ++p) { - cnData.vCP[ r + p] = cnData.vCP[p] ; + for ( int p = nCP - 1 ; p >= b - mult ; --p) { + cnData.vCP[r + p] = cnData.vCP[p] ; } if ( cnData.bRat ) { cnData.vW.resize( nCP + r) ; - for ( int p = b - mult ; p <= nCP ; ++p) { - cnData.vW[ r + p] = cnData.vW[p] ; + for ( int p = nCP - 1 ; p >= b - mult ; --p) { + cnData.vW[r + p] = cnData.vW[p] ; } } @@ -689,11 +695,13 @@ NurbsCurveCanonicalize( CNurbsData& cnData) // aggiungo i punti ottenuti alla curva. for ( int p = L + 1 ; p < b - mult ; ++p) { - cnData.vCP[ b - nDeg + 1 + p] = vBC[p] ; + //cnData.vCP[ b - nDeg + 1 + p] = vBC[p-L] ; + cnData.vCP[p] = vBC[p-L] ; } if ( cnData.bRat ) { for ( int p = L + 1 ; p <= b - mult ; ++p) { - cnData.vW[ b - nDeg + 1 + p] = vBW[p] ; + //cnData.vW[ b - nDeg + 1 + p] = vBW[p-L] ; + cnData.vW[p] = vBW[p-L] ; } } @@ -718,18 +726,18 @@ NurbsCurveCanonicalize( CNurbsData& cnData) // rendo la curva chiusa e non periodica eliminando i primi e gli ultimi nDeg punti e nodi cnData.bPeriodic = false ; - nCP = nCP - 2 * nDeg; - nU = nU - 2 * nDeg ; + nCP = nCP - 2 * nDeg +2; + nU = nU - 2 * nDeg +2; PNTVECTOR vCP_clamped ; vCP_clamped.resize( nCP) ; DBLVECTOR vU_clamped ; vU_clamped.resize( nU) ; for ( int i = 0 ; i < nCP ; ++i) { - vCP_clamped[i] = cnData.vCP[i + nDeg] ; + vCP_clamped[i] = cnData.vCP[i + nDeg-1] ; } cnData.vCP = vCP_clamped ; for ( int i = 0 ; i < nU ; ++i) { - vU_clamped[i] = cnData.vU[i + nDeg] ; + vU_clamped[i] = cnData.vU[i + nDeg-1] ; } cnData.vU = vU_clamped ;