EgtGeomKernel :

- corretti errori nel clamping delle nurbs periodiche.
This commit is contained in:
Daniele Bariletti
2023-10-05 17:29:15 +02:00
parent bf2a3f0e22
commit 10dd5828ce
+29 -21
View File
@@ -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 ;