Graphics programming using c
Home
Question Paperz
Java Projectz
ASP Projectz
8086
Data structures
c++
8085
Tuesday, August 3, 2010
Filling - recursive and non-recursive method
3. Write a program to implement following seed filling algorithms on polygon, circle and an ellipse.
a) floodfill b) boundary fill
Recursive and Non Recursive method
#include<stdio.h> #include<graphics.h> #define ROUND(a)((int)(a+0.5)) struct stack { int x; int y; struct stack *next; }*p,*temp,*head=NULL; typedef struct stack t1; void push(int,int); void pop(); int gd=DETECT,gm=VGAMAX; int xf,yf; void plotcircle(int,int,int,int); void plotellipse(int,int,int,int); void floodfill4(int,int,int,int); void floodfill4nonrec(int,int,int,int); void boundaryfill4(int,int,int,int); void boundaryfill4nonrec(int,int,int,int); void midpointcircle(int,int,int); void midpointellipse(int,int,int,int); void lineDDA(int,int,int,int); int main() { int xc,yc,rx,ry,r,n,choice,ch,newcolor; int oldcolor=getbkcolor(); printf("\nEnter the fill color "); scanf("%d",&newcolor); while(1) { printf("\nMENU\n-------\n1.FLOOD FILL\n2.BOUNDARY FILL\n3.FLOOD FILL NONRECURSIVE\n4.BOUNDARY FILL NONRECURSIVE\n5.EXIT"); printf("\nEnter the choice "); scanf("%d",&ch); if(ch>4) exit(0); printf("\nMENU\n-------\n1.CIRCLE\n2.ELLIPSE\n3.POLYGON\n4.EXIT"); printf("\nEnter the choice "); scanf("%d",&choice); switch(choice) { case 1: printf("\nEnter the center "); scanf("%d%d",&xc,&yc); printf("\nEnter the radius "); scanf("%d",&r); printf("\nEnter the inner point "); scanf("%d%d",&xf,&yf); initgraph(&gd,&gm,NULL); midpoint(xc,yc,r); break; case 2: printf("\nEnter the center "); scanf("%d%d",&xc,&yc); printf("\nEnter the minor and major axes "); scanf("%d%d",&rx,&ry); printf("\nEnter the inner point "); scanf("%d%d",&xf,&yf); initgraph(&gd,&gm,NULL); midpointellipse(xc,yc,rx,ry); break; case 3: printf("\nEnter the no of sides "); scanf("%d",&n); int i,ax[10],ay[10]; for(i=0;i<n;i++) { printf("\nEnter the %d co=ordinates ",i+1); scanf("%d%d",&ax[i],&ay[i]); } printf("\nEnter the inner point "); scanf("%d%d",&xf,&yf); initgraph(&gd,&gm,NULL); for(i=0;i<n;i++) lineDDA(ax[i],ay[i],ax[(i+1)%n],ay[(i+1)%n]); break; case 4: exit(0); break; default:printf("\nInvalid Choice"); } if(ch==1) floodfill4(xf,yf,newcolor,oldcolor); else if(ch==2) boundaryfill4(xf,yf,newcolor,10); else if(ch==2) floodfill4nonrec(xf,yf,newcolor,oldcolor); else boundaryfill4nonrec(xf,yf,newcolor,10); while (!kbhit()); closegraph(); } return 0; } void midpoint(int xc,int yc,int r) { int x=0; int y=r; int p=1-r; plot(xc,yc,x,y); while(x<y) { x++; if(p<0) p+=2*x+1; else { y--; p+=2*(x-y)+1; } plot(xc,yc,x,y); } } void plot(int xc,int yc,int x,int y) { putpixel(xc+x,yc+y,10); putpixel(xc-x,yc+y,10); putpixel(xc+x,yc-y,10); putpixel(xc-x,yc-y,10); putpixel(xc+y,yc+x,10); putpixel(xc-y,yc+x,10); putpixel(xc+y,yc-x,10); putpixel(xc-y,yc-x,10); } void floodfill4(int x,int y,int new,int old) { if(getpixel(x,y)==old) { putpixel(x,y,new); floodfill4(x+1,y,new,old); floodfill4(x-1,y,new,old); floodfill4(x,y+1,new,old); floodfill4(x,y-1,new,old); } } void boundaryfill4(int x,int y,int new,int bdry) { int current=getpixel(x,y); if((current!=bdry)&&(current!=new)) { putpixel(x,y,new); boundaryfill4(x+1,y,new,bdry); boundaryfill4(x-1,y,new,bdry); boundaryfill4(x,y+1,new,bdry); boundaryfill4(x,y-1,new,bdry); } } void floodfill4nonrec(int x,int y,int new,int old) { if(getpixel(x,y)==new) return; push(x,y); putpixel(x,y,new); while(head!=NULL) { pop(); x=p->x; y=p->y; if(getpixel(x+1,y)==old) { putpixel(x+1,y,new); push(x+1,y); } if(getpixel(x-1,y)==old) { putpixel(x-1,y,new); push(x-1,y); } if(getpixel(x,y+1)==old) { putpixel(x,y+1,new); push(x,y+1); } if(getpixel(x,y-1)==old) { putpixel(x,y-1,new); push(x,y-1); } } } void boundaryfill4nonrec(int x,int y,int new,int bdry) { if(getpixel(x,y)==bdry) return; push(x,y); putpixel(x,y,new); while(head!=NULL) { pop(); x=p->x; y=p->y; if((getpixel(x+1,y)!=bdry)&&(getpixel(x+1,y)!=new)) { putpixel(x+1,y,new); push(x+1,y); } if((getpixel(x-1,y)!=bdry)&&(getpixel(x-1,y)!=new)) { putpixel(x-1,y,new); push(x-1,y); } if((getpixel(x,y+1)!=bdry)&&(getpixel(x,y+1)!=new)) { putpixel(x,y+1,new); push(x,y+1); } if((getpixel(x,y-1)!=bdry)&&(getpixel(x,y-1)!=new)) { putpixel(x,y-1,new); push(x,y-1); } } } void midpointellipse(int xc,int yc,int rx,int ry) { int rx2=rx*rx; int ry2=ry*ry; int tworx2=2*rx2; int twory2=2*ry2; int p,x=0,y=ry,px=0,py=tworx2*y; plotellipse(xc,yc,x,y); p=ROUND(ry2-(rx2*ry)+(0.25*rx2)); while(px<py) { x++; px+=twory2; if(p<0) p+=ry2+px; else { y--; py-=tworx2; p+=ry2+px-py; } plotellipse(xc,yc,x,y); } p=ROUND(ry2*(x+.5)*(x+.5)+rx2*(y-1)*(y-1)-rx2*ry2); while(y>0) { y--; py-=tworx2; if(p>0) p+=rx2-py; else { x++; px+=twory2; p+=rx2-py+px; } plotellipse(xc,yc,x,y); } } void plotellipse(int xc,int yc,int x,int y) { putpixel(xc+x,yc+y,10); putpixel(xc-x,yc+y,10); putpixel(xc+x,yc-y,10); putpixel(xc-x,yc-y,10); } void lineDDA(int xa,int ya,int xb,int yb) { int dx,dy,steps,k; dx=xb-xa; dy=yb-ya; float x=xa,y=ya,xinc,yinc; if(abs(dx)>abs(dy)) steps=abs(dx); else steps=abs(dy); xinc=dx/(float)steps; yinc=dy/(float)steps; putpixel(ROUND(x),ROUND(y),10); for(k=0;k<steps;k++) { x+=xinc; y+=yinc; putpixel(ROUND(x),ROUND(y),10); } } void push(int x1,int y1) { temp=(t1 *)malloc(sizeof(t1)); temp->x=x1; temp->y=y1; if(head==NULL) { head=temp; temp->next=NULL; } else { temp->next=head; head=temp; } } void pop() { p=head; head=head->next; }
No comments:
Post a Comment
Newer Post
Older Post
Home
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment