Sunday, November 21, 2010

Draw a piechart

Share Orkut
#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;
}

No comments:

Post a Comment