[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16904] branches/nurbs/blender: - Added weights into bezier reduce function for Degree Reduction.

Emmanuel Stone emmanuel.stone at gmail.com
Fri Oct 3 22:39:15 CEST 2008


Revision: 16904
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16904
Author:   eman
Date:     2008-10-03 22:39:15 +0200 (Fri, 03 Oct 2008)

Log Message:
-----------
- Added weights into bezier reduce function for Degree Reduction.
- Fixed and enabled Non-descructive Degree reduction
 - Works for Clamped curves and surfaces
 

Modified Paths:
--------------
    branches/nurbs/blender/intern/nurbana/intern/NURBS_Degree.cpp
    branches/nurbs/blender/source/blender/include/butspace.h
    branches/nurbs/blender/source/blender/src/buttons_editing.c
    branches/nurbs/blender/source/blender/src/editcurve.c

Modified: branches/nurbs/blender/intern/nurbana/intern/NURBS_Degree.cpp
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/NURBS_Degree.cpp	2008-10-03 20:17:05 UTC (rev 16903)
+++ branches/nurbs/blender/intern/nurbana/intern/NURBS_Degree.cpp	2008-10-03 20:39:15 UTC (rev 16904)
@@ -51,7 +51,6 @@
 
 	int fnlPtsSize = (pntsU+(pntsU-(orderU-1))*Uinc)*(pntsV+(pntsV-(orderV-1))*Vinc);
 	FnlPts = (Point3d*)MEM_callocN(sizeof(Point3d)*fnlPtsSize,"NURBS_Degree::Elevate FnlPts");
-//	FnlPts = (Point3d*)MEM_callocN(sizeof(Point3d)*(pntsU+(pntsU-(orderU-1))*Uinc)*(pntsV+(pntsV-(orderV-1))*Vinc),"NURBS_Degree::Elevate FnlPts");
 	FnlKVU = (nbReal*)MEM_callocN(sizeof(nbReal)*(pntsU+(pntsU-(orderU-1))*Uinc+Uinc+orderU),"NURBS_Degree::Elevate FnlKVU");
 	FnlKVV = (nbReal*)MEM_callocN(sizeof(nbReal)*(pntsV+(pntsV-(orderV-1))*Vinc+Vinc+orderV),"NURBS_Degree::Elevate FnlKVV");
 	Uh = (nbReal*)MEM_callocN(sizeof(nbReal)*((pntsU+(pntsU-(orderU-1))*Uinc+Uinc+orderU) > (pntsV+(pntsV-(orderV-1))*Vinc+Vinc+orderV) ? pntsU+(pntsU-(orderU-1))*Uinc+Uinc+orderU : pntsV+(pntsV-(orderV-1))*Vinc+Vinc+orderV),"NURBS_Degree::Elevate Uh");
@@ -384,7 +383,7 @@
 			newCtlPts[i].y= FnlPts[i].y;
 			newCtlPts[i].z= FnlPts[i].z;
 			newCtlPts[i].H= FnlPts[i].H;
-			printf("newCtlPts[%d]: %.3f,%.3f,%.3f:%.3f\n",i,newCtlPts[i].z,newCtlPts[i].y,newCtlPts[i].z,newCtlPts[i].H);
+			printf("newCtlPts[%d]: %.3f,%.3f,%.3f:%.3f\n",i,newCtlPts[i].x,newCtlPts[i].y,newCtlPts[i].z,newCtlPts[i].H);
 
 		}
 		obj -> ReplaceCtlPts(newCtlPts);
@@ -420,17 +419,19 @@
 void NURBS_Degree::BezDegReduce(Point3d *bpts, Point3d *rbpts, int Degree, nbReal &MaxErr) {
 	// Reduce Bezier segment and store in rbpts
 	int	i,r;
-	nbReal	a,a2,x,y,z;
+	nbReal	a,a2,x,y,z,H;
 
 	r= (Degree-1)/2;
 
 	rbpts[0].x= bpts[0].x;
 	rbpts[0].y= bpts[0].y;
 	rbpts[0].z= bpts[0].z;
+	rbpts[0].H= bpts[0].H;
 
 	rbpts[Degree-1].x= bpts[Degree].x;
 	rbpts[Degree-1].y= bpts[Degree].y;
 	rbpts[Degree-1].z= bpts[Degree].z;
+	rbpts[Degree-1].H= bpts[Degree].H;
 
 	// Two cases, Even or Odd
 	if(Degree%2) {
@@ -440,25 +441,30 @@
 			rbpts[i].x= (bpts[i].x-a*rbpts[i-1].x)/(1.0-a);
 			rbpts[i].y= (bpts[i].y-a*rbpts[i-1].y)/(1.0-a);
 			rbpts[i].z= (bpts[i].z-a*rbpts[i-1].z)/(1.0-a);
+			rbpts[i].H= (bpts[i].H-a*rbpts[i-1].H)/(1.0-a);
 		} //eof
 		for(i= Degree-2; i >= r+1; i--) {
 			a= nbReal(i+1)/nbReal(Degree);
 			rbpts[i].x= (bpts[i+1].x-(1.0-a)*rbpts[i+1].x)/a;
 			rbpts[i].y= (bpts[i+1].y-(1.0-a)*rbpts[i+1].y)/a;
 			rbpts[i].z= (bpts[i+1].z-(1.0-a)*rbpts[i+1].z)/a;
+			rbpts[i].H= (bpts[i+1].H-(1.0-a)*rbpts[i+1].H)/a;
 		} //eof
 		a= nbReal(r)/(nbReal(Degree));
 		rbpts[r].x= (bpts[r].x - a*rbpts[r-1].x)/(1.0-a);
 		rbpts[r].y= (bpts[r].y - a*rbpts[r-1].y)/(1.0-a);
 		rbpts[r].z= (bpts[r].z - a*rbpts[r-1].z)/(1.0-a);
+		rbpts[r].H= (bpts[r].H - a*rbpts[r-1].H)/(1.0-a);
 		a= nbReal(r+1)/(nbReal(Degree));
 		rbpts[r].x+= (bpts[r+1].x-(1.0-a)*rbpts[r+1].x)/a;
 		rbpts[r].y+= (bpts[r+1].y-(1.0-a)*rbpts[r+1].y)/a;
 		rbpts[r].z+= (bpts[r+1].z-(1.0-a)*rbpts[r+1].z)/a;
+		rbpts[r].H+= (bpts[r+1].H-(1.0-a)*rbpts[r+1].H)/a;
 
 		rbpts[r].x*= 0.5;
 		rbpts[r].y*= 0.5;
 		rbpts[r].z*= 0.5;
+		rbpts[r].H*= 0.5;
 	} else {
 		// Even
 		for(i= 1; i <= r; i++) {
@@ -466,16 +472,18 @@
 			rbpts[i].x= (bpts[i].x-a*rbpts[i-1].x)/(1.0-a);
 			rbpts[i].y= (bpts[i].y-a*rbpts[i-1].y)/(1.0-a);
 			rbpts[i].z= (bpts[i].z-a*rbpts[i-1].z)/(1.0-a);
+			rbpts[i].H= (bpts[i].H-a*rbpts[i-1].H)/(1.0-a);
 		} //eof
 		for(i= Degree-2; i >= r+1; i--) {
 			a= nbReal(i+1)/nbReal(Degree);
 			rbpts[i].x= (bpts[i+1].x - (1.0-a)*rbpts[i+1].x)/a;
 			rbpts[i].y= (bpts[i+1].y - (1.0-a)*rbpts[i+1].y)/a;
 			rbpts[i].z= (bpts[i+1].z - (1.0-a)*rbpts[i+1].z)/a;
+			rbpts[i].H= (bpts[i+1].H - (1.0-a)*rbpts[i+1].H)/a;
 		} //eof
 	} //fi
 
-	// Error Calculation
+	// Error Calculation // TODO -eman cache _Basis calls
 	if(Degree%2) {
 		// Odd
 		a= nbReal(r)/(nbReal(Degree));
@@ -483,15 +491,17 @@
 		x= (0.5)*(1.0-a)*((_Basis(r,Degree,0.5)-_Basis(r+1,Degree,0.5))*(((bpts[r].x-a*rbpts[r-1].x)/(1.0-a))-((bpts[r+1].x-(1.0-a2)*rbpts[r+1].x)/(a2))));
 		y= (0.5)*(1.0-a)*((_Basis(r,Degree,0.5)-_Basis(r+1,Degree,0.5))*(((bpts[r].y-a*rbpts[r-1].y)/(1.0-a))-((bpts[r+1].y-(1.0-a2)*rbpts[r+1].y)/(a2))));
 		z= (0.5)*(1.0-a)*((_Basis(r,Degree,0.5)-_Basis(r+1,Degree,0.5))*(((bpts[r].z-a*rbpts[r-1].z)/(1.0-a))-((bpts[r+1].z-(1.0-a2)*rbpts[r+1].z)/(a2))));
+		H= (0.5)*(1.0-a)*((_Basis(r,Degree,0.5)-_Basis(r+1,Degree,0.5))*(((bpts[r].H-a*rbpts[r-1].H)/(1.0-a))-((bpts[r+1].H-(1.0-a2)*rbpts[r+1].H)/(a2))));
 	} else {
 		// Even
 		x= _Basis(r+1,Degree,0.5)*(bpts[r+1].x-0.5*(rbpts[r].x+rbpts[r+1].x));
 		y= _Basis(r+1,Degree,0.5)*(bpts[r+1].y-0.5*(rbpts[r].y+rbpts[r+1].y));
 		z= _Basis(r+1,Degree,0.5)*(bpts[r+1].z-0.5*(rbpts[r].z+rbpts[r+1].z));
+		H= _Basis(r+1,Degree,0.5)*(bpts[r+1].H-0.5*(rbpts[r].H+rbpts[r+1].H));
 	} //fi
 	// Assumption, take the length of the error vector???
 	//  printf("Ex: %f, Ey: %f, Ez: %f\n",x,y,z);
-	MaxErr= sqrt(x*x+y*y+z*z);
+	MaxErr= sqrt(x*x+y*y+z*z+H*H);
 }
 
 
@@ -536,16 +546,20 @@
 				if(UV) {
 					// V Directional Curves
 					for(i= 0; i < obj -> Length(1); i++) {
-						Pts[i].x= obj -> CtlPts()[i+obj -> Length(1)*Curve].x;
-						Pts[i].y= obj -> CtlPts()[i+obj -> Length(1)*Curve].y;
-						Pts[i].z= obj -> CtlPts()[i+obj -> Length(1)*Curve].z;
+						int indx = i*obj -> Length(0)+Curve;
+						Pts[i].x= obj -> CtlPts()[indx].x;
+						Pts[i].y= obj -> CtlPts()[indx].y;
+						Pts[i].z= obj -> CtlPts()[indx].z;
+						Pts[i].H= obj -> CtlPts()[indx].H;
 					} //eof
 				} else {
 					// U Directional Curves
 					for(i= 0; i < obj -> Length(0); i++) {
-						Pts[i].x= obj -> CtlPts()[i*obj -> Length(1)+Curve].x;
-						Pts[i].y= obj -> CtlPts()[i*obj -> Length(1)+Curve].y;
-						Pts[i].z= obj -> CtlPts()[i*obj -> Length(1)+Curve].z;
+						int indx = i+obj -> Length(0)*Curve;
+						Pts[i].x= obj -> CtlPts()[indx].x;
+						Pts[i].y= obj -> CtlPts()[indx].y;
+						Pts[i].z= obj -> CtlPts()[indx].z;
+						Pts[i].H= obj -> CtlPts()[indx].H;
 					} //eof
 				} //fi
 				for(i= 0; i < obj -> Length(UV) + obj -> Order(UV); i++)
@@ -571,6 +585,7 @@
 					Temp[0].x= Pts[0].x;
 					Temp[0].y= Pts[0].y;
 					Temp[0].z= Pts[0].z;
+					Temp[0].H= Pts[0].H;
 
 					// Compute left end of knot vector
 					for(i= 0; i <= ph; i++)
@@ -581,6 +596,7 @@
 						bpts[i].x= Pts[i].x;
 						bpts[i].y= Pts[i].y;
 						bpts[i].z= Pts[i].z;
+						bpts[i].H= Pts[i].H;
 					} //eof
 
 					// Initialize Error Vector
@@ -620,11 +636,13 @@
 									bpts[k].x= alphas[k-s]*bpts[k].x + (1.0-alphas[k-s])*bpts[k-1].x;
 									bpts[k].y= alphas[k-s]*bpts[k].y + (1.0-alphas[k-s])*bpts[k-1].y;
 									bpts[k].z= alphas[k-s]*bpts[k].z + (1.0-alphas[k-s])*bpts[k-1].z;
+									bpts[k].H= alphas[k-s]*bpts[k].H + (1.0-alphas[k-s])*bpts[k-1].H;
 								} //eof
 
 								Nextbpts[save].x= bpts[Degree].x;
 								Nextbpts[save].y= bpts[Degree].y;
 								Nextbpts[save].z= bpts[Degree].z;
+								Nextbpts[save].H= bpts[Degree].H;
 							} //eof
 						} //fi
 
@@ -652,10 +670,12 @@
 									Temp[i-1].x= (Temp[i-1].x-(1.0-alfa)*Temp[i-2].x)/alfa;
 									Temp[i-1].y= (Temp[i-1].y-(1.0-alfa)*Temp[i-2].y)/alfa;
 									Temp[i-1].z= (Temp[i-1].z-(1.0-alfa)*Temp[i-2].z)/alfa;
+									Temp[i-1].z= (Temp[i-1].H-(1.0-alfa)*Temp[i-2].H)/alfa;
 
 									rbpts[kj].x= (rbpts[kj].x-beta*rbpts[kj+1].x)/(1.0-beta);
 									rbpts[kj].y= (rbpts[kj].y-beta*rbpts[kj+1].y)/(1.0-beta);
 									rbpts[kj].z= (rbpts[kj].z-beta*rbpts[kj+1].z)/(1.0-beta);
+									rbpts[kj].z= (rbpts[kj].H-beta*rbpts[kj+1].H)/(1.0-beta);
 
 									i++;
 									j--;
@@ -669,6 +689,7 @@
 									A.x= delta*rbpts[kj+1].x+(1.0-delta)*Temp[i-2].x;
 									A.y= delta*rbpts[kj+1].y+(1.0-delta)*Temp[i-2].y;
 									A.z= delta*rbpts[kj+1].z+(1.0-delta)*Temp[i-2].z;
+									A.z= delta*rbpts[kj+1].H+(1.0-delta)*Temp[i-2].H;
 									Br= NurbanaMath::Dist4d(Temp[i-1],A);
 								} //fi
 
@@ -705,6 +726,7 @@
 							Temp[cind].x= rbpts[i].x;
 							Temp[cind].y= rbpts[i].y;
 							Temp[cind].z= rbpts[i].z;
+							Temp[cind].H= rbpts[i].H;
 							cind++;
 						} //eof
 
@@ -713,6 +735,7 @@
 							bpts[i].x= Nextbpts[i].x;
 							bpts[i].y= Nextbpts[i].y;
 							bpts[i].z= Nextbpts[i].z;
+							bpts[i].H= Nextbpts[i].H;
 						} //eof
 
 						for(i= r; i <= Degree; i++) {
@@ -720,6 +743,7 @@
 								bpts[i].x= Pts[b-Degree+i].x;
 								bpts[i].y= Pts[b-Degree+i].y;
 								bpts[i].z= Pts[b-Degree+i].z;
+								bpts[i].H= Pts[b-Degree+i].H;
 							} //fi
 						} //eof
 
@@ -738,6 +762,7 @@
 						Pts[i].x= Temp[i].x;
 						Pts[i].y= Temp[i].y;
 						Pts[i].z= Temp[i].z;
+						Pts[i].H= Temp[i].H;
 					} //eof
 
 					for(i= 0; i < Npts+Order; i++)
@@ -754,6 +779,7 @@
 						FnlPts[indx].x= Pts[i].x;
 						FnlPts[indx].y= Pts[i].y;
 						FnlPts[indx].z= Pts[i].z;
+						FnlPts[indx].H= Pts[i].H;
 					} //eof
 				} else {
 					// U Directional Curves
@@ -762,6 +788,7 @@
 						FnlPts[indx].x= Pts[i].x;
 						FnlPts[indx].y= Pts[i].y;
 						FnlPts[indx].z= Pts[i].z;
+						FnlPts[indx].H= Pts[i].H;
 						printf("U FnlPts[%d]: %.3f,%.3f,%.3f:%.3f\n",indx,FnlPts[indx].x,FnlPts[indx].y,FnlPts[indx].z,FnlPts[indx].H);
 
 						//// Update Original because we know U is just tacked onto the end of the array and
@@ -807,6 +834,7 @@
 		obj -> CtlPts()[i].x= FnlPts[i].x;
 		obj -> CtlPts()[i].y= FnlPts[i].y;
 		obj -> CtlPts()[i].z= FnlPts[i].z;
+		obj -> CtlPts()[i].H= FnlPts[i].H;
 	} //eof
 	//obj->ReplaceCtlPts(FnlPts);
 	// Copy Final Points into Original Points

Modified: branches/nurbs/blender/source/blender/include/butspace.h
===================================================================
--- branches/nurbs/blender/source/blender/include/butspace.h	2008-10-03 20:17:05 UTC (rev 16903)
+++ branches/nurbs/blender/source/blender/include/butspace.h	2008-10-03 20:39:15 UTC (rev 16904)
@@ -495,9 +495,10 @@
 #define B_ISOLINES			2130
 #define B_DEGREEELEVATEU		2131
 #define B_DEGREEELEVATEV		2132
-#define B_DEGREEREDUCE		2133
-#define B_REFINECURVE		2134
-#define B_SETRESOL			2135
+#define B_DEGREEREDUCEU		2133
+#define B_DEGREEREDUCEV	2134
+#define B_REFINECURVE		2135
+#define B_SETRESOL			2136
 
 /* *********************** */
 #define B_FONTBUTS		2300

Modified: branches/nurbs/blender/source/blender/src/buttons_editing.c

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list