Graphics programming using c
Home
Question Paperz
Java Projectz
ASP Projectz
8086
Data structures
c++
8085
Tuesday, October 5, 2010
Bezier, Bspline, Cubic Spline Curves
#include<stdio.h> #include<graphics.h> #include<math.h> #define ROUND(a)((int)(a+0.5)) int gd=DETECT,gm=VGAMAX; struct point { double x,y,z; }controls[10],output[200]; int outCount; void computeCoefBezier(int n,int *c) { int k,i; for(k=0;k<=n;k++) { c[k]=1; for(i=n;i>=k+1;i--) c[k]*=i; for(i=n-k;i>=2;i--) c[k]/=i; } } void computePointBezier(float u,int nControls,int *c,struct point *calcxyz) { int k,n=nControls-1; float blend; calcxyz->x=0; calcxyz->y=0; calcxyz->z=0; for(k=0;k<nControls;k++) { blend=c[k]*pow(u,k)*pow(1-u,n-k); calcxyz->x+=controls[k].x*blend; calcxyz->y+=controls[k].y*blend; calcxyz->z+=controls[k].z*blend; } } void bezier(int nControls) { int *c=(int *)malloc(nControls*sizeof(int)); int i; computeCoefBezier(nControls-1,c); for(i=0;i<=outCount;i++) computePointBezier(i/(float)outCount,nControls,c,&output[i]); } double blend(int k, int t, int *u, double v) { double value; if (t==1) { if ((u[k]<=v) && (v<u[k+1])) value=1; else value=0; } else { if ((u[k+t-1]==u[k]) && (u[k+t]==u[k+1])) value = 0; else if (u[k+t-1]==u[k]) value = (u[k+t] - v) / (u[k+t] - u[k+1]) * blend(k+1, t-1, u, v); else if (u[k+t]==u[k+1]) value = (v - u[k]) / (u[k+t-1] - u[k]) * blend(k, t-1, u, v); else value = (v - u[k]) / (u[k+t-1] - u[k]) * blend(k, t-1, u, v) + (u[k+t] - v) / (u[k+t] - u[k+1]) * blend(k+1, t-1, u, v); } return value; } void compute_intervals(int *u, int n, int t) { int j; for (j=0; j<=n+t; j++) { if (j<t) u[j]=0; else if ((t<=j) && (j<=n)) u[j]=j-t+1; else if (j>n) u[j]=n-t+2; } } void compute_point(int *u, int n, int t, double v,struct point *calc) { int k; double temp; calc->x=0; calc->y=0; calc->z=0; for (k=0; k<=n; k++) { temp = blend(k,t,u,v); calc->x = calc->x + (controls[k]).x * temp; calc->y = calc->y + (controls[k]).y * temp; calc->z = calc->z + (controls[k]).z * temp; } } void bspline(int n, int t) { int *u=(int *)malloc((n+t+1)*sizeof(int)); double increment,interval; int i; compute_intervals(u, n, t); increment=(double) (n-t+2)/(outCount-1); interval=0; for (i=0; i<outCount; i++) { compute_point(u, n, t, interval,&output[i]); interval=interval+increment; } output[outCount].x=controls[n].x; output[outCount].y=controls[n].y; output[outCount].z=controls[n].z; } void drawCurve() { int i; for(i=0;i<outCount;i++) line(output[i].x,output[i].y,output[i+1].x,output[i+1].y); } void cubic(int n) { int i,j; float u,f1,f2,f3,f4,px,py,px1,py1; initgraph(&gd,&gm,"NULL"); setcolor(2); for(i=0;i<n-1;i++) { for(j=0;j<=40;j++) { u=j/(float)40; f1=(2*u*u*u)-(3*u*u)+1; f2=-(2*u*u*u)+(3*u*u); f3=(u*u*u)-(2*u*u)+u; f4=(u*u*u)-(u*u); px=((float)controls[i].x*f1)+((float)controls[i+1].x*f2)+((float)controls[i].x*f3)+((float)controls[i+1].x*f4); py=((float)controls[i].y*f1)+((float)controls[i+1].y*f2)+((float)controls[i].y*f3)+((float)controls[i+1].y*f4); if(j>0) line(ROUND(px1),ROUND(py1),ROUND(px),ROUND(py)); px1=px; py1=py; } } setcolor(5); for(i=0;i<n;i++) circle(controls[i].x,controls[i].y,2); while(!kbhit()); closegraph(); } int main() { int i,n,ch,t=3; printf("\nEnter the no of controls points"); scanf("%d",&n); printf("\nEnter the cordinates"); for(i=0;i<n;i++) { printf("x%d,y%d=",i,i); scanf("%lf%lf",&controls[i].x,&controls[i].y); } outCount=n*15; while(1) { printf("\nMENU\n-------\n1.Bspline\n2.Bezier\n3.Cubic Spline\n4.EXIT"); printf("\nEnter the choice "); scanf("%d",&ch); switch(ch) { case 1: if(n<3) { printf("\nBspline doesnt give good result"); exit(0); } bspline(n-1,t); break; case 2: bezier(n); break; case 3: cubic(n); break; case 4: exit(0); default:printf("\nInvalid Entry"); } if(ch==1||ch==2) { initgraph(&gd,&gm,"NULL"); setcolor(2); drawCurve(); setcolor(5); for(i=0;i<n;i++) circle(controls[i].x,controls[i].y,2); while(!kbhit()); closegraph(); } } return 0; }
No comments:
Post a Comment
Newer Post
Older Post
Home
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment