#include<stdio.h> #include<graphics.h> #include<math.h> #define ROUND(a)((int)(a+0.5)) int p[10]; float trans[3][3],result[3][1],xandy[3][1]; void plot(int,int,int,int); void boundaryfill4(int,int,int,int); void DDA(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 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 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 mulmat() { int i,j,k; for(i=0;i<3;i++) { for(j=0;j<1;j++) { result[i][j]=0.0; for(k=0;k<3;k++) result[i][j]+=trans[i][k]*xandy[k][j]; } } } void transformpoint(int x,int y) { xandy[0][0]=x; xandy[1][0]=y; xandy[2][0]=1; mulmat(); } void makeIdentity() { int i,j; for(i=0;i<3;i++) { for(j=0;j<3;j++) trans[i][j]=0.0; trans[i][i]=1.0; } } void rotate(int rx,int ry,int an) { float ang; ang=(float)(an*(3.14/180)); trans[0][0]=cos(ang); trans[0][1]=-sin(ang); trans[0][2]=rx*(1-cos(ang))+ry*sin(ang); trans[1][0]=sin(ang); trans[1][1]=cos(ang); trans[1][2]=ry*(1-cos(ang))-rx*sin(ang); } int main() { int gd=DETECT,gm=VGAMAX,n,i,tot=0,r=100,rx,ry,x,y,midx,midy,prx,pry; float an1=0.0,an=0.0; printf("enter the no. of data"); scanf("%d",&n); do{ for(i=0;i<n;i++) { printf("\nEnter the data "); scanf("%d",&p[i]); tot+=p[i]; } if(tot!=100) { printf("Error in data. Enter it again "); tot=0; } }while(tot!=100); initgraph(&gd,&gm,"NULL"); rx=getmaxx()/2; ry=getmaxy()/2; x=rx; y=r+ry; midx=rx; midy=(y+ry)/2; midpoint(rx,ry,r); DDA(rx,ry,x,y); for(i=0;i<n;i++) { makeIdentity(); an1=an+(float)(p[i]*3.6)/2; an+=(float)p[i]*3.6; rotate(rx,ry,an); transformpoint(x,y); DDA(rx,ry,result[0][0],result[1][0]); makeIdentity(); rotate(rx,ry,an1); transformpoint(midx,midy); boundaryfill4(result[0][0],result[1][0],i+1,10); } while(!kbhit()); closegraph(); return 0; }
Sunday, November 21, 2010
Draw a piechart

Draw a Sierpinski triangle

#include<stdio.h> #include<graphics.h> #include<math.h> #define pi 3.142857 #define ROUND(a)((int)(a+0.5)) int max; void DDA(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),5); for(k=0;k<steps;k++) { x+=xinc; y+=yinc; putpixel(ROUND(x),ROUND(y),5); } } float minside(int x1,int y1,int x2,int y2,int x3,int y3) { float a,b,c,s; a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); b=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3)); c=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3)); if(a>b) s=a; else s=b; if(s>c) s=c; return s; } void triangle(int x1,int y1,int x2,int y2,int x3,int y3,int i) { float newx1,newy1,newx2,newy2,newx3,newy3; i++; if(i==max) return; else { DDA(x1,y1,x2,y2); DDA(x2,y2,x3,y3); DDA(x3,y3,x1,y1); newx1=(x1+x2)/2 ; newy1=(y1+y2)/2; newx2=(x2+x3)/2 ; newy2=(y2+y3)/2; newx3=(x1+x3)/2 ; newy3=(y1+y3)/2; triangle(x1,y1,newx1,newy1,newx3,newy3,i); triangle(x2,y2,newx1,newy1,newx2,newy2,i); triangle(x3,y3,newx2,newy2,newx3,newy3,i); } } int main() { int gd=DETECT,gm=VGAMAX; int x1,y1,x2,y2,x3,y3; float small; printf("\n Enter the 1st coordinates of the triangle"); scanf("%d%d",&x1,&y1); printf("\n enter the 2nd coordinates of the triangle"); scanf("%d%d",&x2,&y2); printf("\n enter the 3rd coordinates of the triangle"); scanf("%d%d",&x3,&y3); initgraph(&gd,&gm,"null"); small=minside(x1,y1,x2,y2,x3,y3); max=2+(int)small/20; triangle(x1,y1,x2,y2,x3,y3,0); while (!kbhit()); closegraph(); return 0; }
Draw a polygon. Use Bresenham line drawing algorithm

//Reference:- David F. Rogers "Procedural Elements for Computer Graphics" Second Edition #include<stdio.h> #include<graphics.h> #include<math.h> #define ROUND(a)((int)(a+0.5)) struct point { int x,y; }pol[10]; int n; void DDA(int,int,int,int); void Bresenham(int,int,int,int); void readpoly() { int i; for(i=0;i<n;i++) { printf("\nEnter the %d coordinates ",i+1); scanf("%d%d",&pol[i].x,&pol[i].y); } } void drawpolygonDDA() { int i; for(i=0;i<n;i++) DDA(pol[i].x,pol[i].y,pol[(i+1)%n].x,pol[(i+1)%n].y); } void drawpolygonBres() { int i; for(i=0;i<n;i++) { delay(500); Bresenham(pol[i].x,pol[i].y,pol[(i+1)%n].x,pol[(i+1)%n].y); } } int main() { int xa,ya,xb,yb,choice,gd=DETECT,gm=VGAMAX; printf("\nEnter the no of sides "); scanf("%d",&n); readpoly(); initgraph(&gd,&gm,NULL); printf("Press any key to draw traingle using Bresenham line drawing algortihm over the triangle drawn using DDA line drawing algorithm"); drawpolygonDDA(); getch(); drawpolygonBres(); while (!kbhit()); closegraph(); return 0; } void DDA(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),5); for(k=0;k<steps;k++) { x+=xinc; y+=yinc; putpixel(ROUND(x),ROUND(y),5); } } void Bresenham(int xa,int ya,int xb,int yb) { int i,dx=xb-xa,dy=yb-ya,p,twod,twodd,s; float m=2; if(dx!=0) m=(float)dy/(float)dx; if(m>=-1&&m<=1) { if(xa>xb) { Bresenham(xb,yb,xa,ya); return; } p=2*dx-dy; if(dy<0) { s=-1; dy=-dy; } else s=1; putpixel(xa,ya,10); for(i=0;i<dy;i++) { while(p>0) { xa++; p-=2*dy; putpixel(xa,ya,10); } ya+=s; p+=2*dx; putpixel(xa,ya,10); } } else { if(ya>yb) { Bresenham(xb,yb,xa,ya); return; } p=2*dy-dx; if(dx<0) { s=-1; dx=-dx; } else s=1; putpixel(xa,ya,10); for(i=0;i<dx;i++) { while(p>0) { ya++; p-=2*dx; putpixel(xa,ya,10); } xa+=s; p+=2*dy; putpixel(xa,ya,10); } } }
Subscribe to:
Posts (Atom)