#include<graphics.h>
#include<math.h>
void dra(int x,int y,int x1,int y1,int x2,int y2,int x3,int y3)
{
   line(320+x,240-y,320+x1,240-y1);
   line(x1+320,240-y1,320+x2,240-y2);
   line(x2+320,240-y2,320+x3,240-y3);
   line(320+x3,240-y3,x+320,240-y);
}
void main()
{
   int x,d,y,l,w,h,k,i,b[5][5],j,p,gd=0,gm,t,n,n1=1;
   float an,s,co,fx,fy,a[5][5],c[5][5];
   clrscr();
   initgraph(&gd,&gm,"D:\\tc\\bgi");
   printf("Enter a point(x,y): ");
   scanf("%d%d",&x,&y);
   printf("Enter length and width: ");
   scanf("%d%d",&l,&w);
   setcolor(1);
   line(0,240,640,240);
   line(320,0,320,480);
   dra(x,y,x,y+w,x+l,y+w,x+l,y);
   a[2][0]=0;
   a[2][1]=0;
   a[2][2]=1;

   b[0][0]=x;
   b[0][1]=x;
   b[0][2]=x+l;
   b[0][3]=x+l;

   b[1][0]=y;
   b[1][1]=y+w;
   b[1][2]=y+w;
   b[1][3]=y;

   b[2][0]=1;
   b[2][1]=1;
   b[2][2]=1;
   b[2][3]=1;

   printf("Enter your choice from 1 to 4.\n1 for rotate.\n2 for scaling.\n3 for reflect.\n4 for exit.");
   do
   {
     scanf("%d",&n);
     if(n==2)
     {
       printf("Enter any fixed point(x,y): ");
       scanf("%d%d",&h,&k);
       printf("Enter scaling factor in x directio: ");
       scanf("%f",&fx);
       printf("Enter scaling factor in y directio: ");
       scanf("%f",&fy);
       a[0][0]= fx;
       a[0][1]=0;
       a[0][2]=-h*fx+h;

       a[1][0]=0;
       a[1][1]=fy;
       a[1][2]=-k*fy+k;

        for(i=0;i<3;i++)
        for(j=0;j<4;j++)
        {
           c[i][j]=0;
           for(p=0;p<3;p++)
           c[i][j]=c[i][j]+a[i][p]*b[p][j];
        }
        setcolor(5);
        dra(c[0][0],c[1][0],c[0][1],c[1][1],c[0][2],c[1][2],c[0][3],c[1][3]);

      }
      if(n==3)
      {
      printf("Enter your choice from 1 to 4.\n1 for x axis.\n2 for y axis.\n3for co-ordinate axis.\n4for exit.");
     do
     {
         scanf("%d",&d);
         if(d==1)
         {
           a[0][0]=1;
           a[1][1]=-1;
         }
         if(d==2)
         {
           a[0][0]=-1;
           a[1][1]=1;
         }
         if(d==3)
         {
           a[0][0]=-1;
           a[1][1]=-1;
         }
          a[0][1]=0;
         a[0][2]=0;
         a[1][0]=0;
         a[1][2]=0;


         for(i=0;i<3;i++)
         for(j=0;j<4;j++)
         {
           c[i][j]=0;
           for(p=0;p<3;p++)
           c[i][j]=c[i][j]+a[i][p]*b[p][j];
         }
         setcolor(5);
         dra(c[0][0],c[1][0],c[0][1],c[1][1],c[0][2],c[1][2],c[0][3],c[1][3]);
     }while(d!=4);
    }
     if(n==1)
     {
      printf("Enter any fixed point(x,y): ");
      scanf("%d%d",&h,&k);
      printf("Enter angle: ");
      scanf("%f",&an);
      for(t=0;t<=an;t++)
      {
        co=cos(t*M_PI/180.0);
        s=sin(t*M_PI/180.0);

        a[0][0]= co;
        a[0][1]=-s;
        a[0][2]=-h*co+k*s+h;

        a[1][0]=s;
        a[1][1]=co;
        a[1][2]=-h*s-k*co+k;
        for(i=0;i<3;i++)
        for(j=0;j<4;j++)
        {
          c[i][j]=0;
          for(p=0;p<3;p++)
          c[i][j]=c[i][j]+a[i][p]*b[p][j];
        }
        setcolor(n1);
        n1++;
        dra(c[0][0],c[1][0],c[0][1],c[1][1],c[0][2],c[1][2],c[0][3],c[1][3]);
        delay(100);
        setcolor(0);
        if((an-t)>0)
        dra(c[0][0],c[1][0],c[0][1],c[1][1],c[0][2],c[1][2],c[0][3],c[1][3]);
        setcolor(1);
        line(0,240,640,240);
        line(320,0,320,480);
        dra(x,y,x,y+w,x+l,y+w,x+l,y);
       }
     }
   }while(n!=4);
}