Monday, October 17, 2011

Implementation of 2-D transformations

C program for translations-scaling -rotation-reflection

#include<iostream.h>
#include<conio.h>
#include<graphics.h>
long double object[10][10],translate[10][10],translate2[10][10],output[10][10],theta;
long double scale[10][10], mirror[10][10],rotate[10][10],output2[10][10],output3[10][10];
int n ,i,j,k;
void init(long double a[10][10])
{ for(i=0;i<10;i++)
     for(j=0;j<10;j++)
     a[i][j]=0;
}
void input(long double a[10][10],int b)
{for( i=0;i<b;i++)
     {cout<<"\nenter row  #"<<i+1<<endl;
      cin>>a[i][0]>>a[i][1]>>a[i][2];
     }
}
void matmulti(long double a[10][10],long double b[10][10],long double c[10][10])
{for(i=0;i<n;i++)
  for(j=0;j<3;j++)
   for(k=0;k<n;k++)
       c[i][j]+=a[i][k]*b[k][j];
}

void display(long double a[10][10])
{ for(i=0;i<n-1;i++)
      line(a[i][0],a[i][1],a[i+1][0],a[i+1][1]);
       line(a[0][0],a[0][1],a[n-1][0],a[n-1][1]);
}

void matdisp(long double a[10][10],int b)
{  for(i=0;i<b;i++)
  {for(j=0;j<3;j++)
   cout<<a[i][j]<<"  ";
   cout<<endl;
  }
}

void matdisp(long double a[10][10],long double b[10][10],long double c[10][10])
{  for(i=0;i<3;i++)
  {for(j=0;j<3;j++)
   cout<<a[i][j]<<"   ";
   cout<<"           ";
   for(j=0;j<3;j++)
   cout<<b[i][j]<<"   ";
   cout<<"           ";
   for(j=0;j<3;j++)
   cout<<c[i][j]<<"   ";
   cout<<endl;
  }
}
void matdisp(long double a[10][10],long double b[10][10])
{  for(i=0;i<n;i++)
  {for(j=0;j<3;j++)
   cout<<a[i][j]<<"  ";
   cout<<"              ";
   for(j=0;j<3;j++)
   cout<<b[i][j]<<"  ";
   cout<<endl;
  }
}

int main()
{clrscr();
 int i,j,ch,gd=DETECT,gm;
long double theta;
char choice='n';
 do{
 if(choice=='n')
 {cout<<"\n enter the no of verices in the figure";
  cin>>n;
  cout<<"\ enter the object matrix";
  input(object,n);
 }
  initgraph(&gd,&gm,"");
  display(object);
 getch();
 closegraph();
 cout<<"\n choose an operation";
 cout<<"\n 0.translate ";
 cout<<"\n 1.simple scale";
 cout<<"\n 2.fix point scale";
 cout<<"\n 3.simple rotate";
 cout<<"\n 4.fix point rotate";
 cout<<"\n 5.reflection about x-axis";
  cout<<"\n 6.reflection about y- axis";
 cout<<"\n Enter CHOICE : ";

 cin>>ch;
 if(ch==0)
{ cout<<"\n enter the translation matrix";
  input(translate,3);
  matmulti(object,translate,output3);
  cout<<endl;
  cout<<"\n OBJECT MATRICX\n";
  matdisp(object,n);
  getch();
  cout<<"\n translation matrix \n";
  matdisp(translate,3);
  cout<<"\n output matrix \n";
  matdisp(output3,n);
  getch();
}
 if(ch==1)
{ cout<<"\n enter the scaling matrix";
  input(scale,3);
  matmulti(object,scale,output3);
  cout<<endl;
  cout<<"\n OBJECT MATRICX\n";
  matdisp(object,n);
  getch();
  cout<<"\n scaling matrix \n";
  matdisp(scale,3);            
  cout<<"\noutput matrix \n";
  matdisp(output3,n);
  getch();

  getch();
}
 if(ch==2)
{ cout<<"\n enter the translation matrix";
  input(translate,3);
  cout<<"\n enter the scaling matrix";
  input(scale,3);
  cout<<"\n enter the inverse translation matrix";
  input(translate2,3);
  cout<<"\n object matrix\n";
  matdisp(object,n);
  cout<<"\n transformation matrixes       \n";
  cout<<"    TRANSLATION            SCALING            DE TRANSLATION  \n";
  matdisp(translate,scale,translate2);
  getch();
  matmulti(translate,scale,output);
  matmulti(output,translate2,output2);
  matmulti(object,output2,output3);
  cout<<"\n output matrix is \n";
  matdisp(output3,n);
  cout<<endl;
  getch();
}
 if(ch==3)
{  cout<<"\n enter the rotation matrix";
   input(rotate,3);
   matmulti(object,rotate,output3);
   cout<<endl;
   cout<<"\n OBJECT MATRICX\n";
  matdisp(object,n);
  getch();
    cout<<"\n rotation matrix \n";
  matdisp(rotate,3);
  cout<<"\n output matrix \n";
  matdisp(output3,n);
   getch();
}

 if(ch==4)
{  cout<<"\n enter the translation matrix";
   input(translate,3);
   cout<<"\n enter the rotation matrix";
   input(rotate,3);
   cout<<"\n enter the inverse translation matrix";
   input(translate2,3);
   cout<<"\n object matrix\n";
   matdisp(object,n);
   cout<<"\n transformation matrixes       \n";
   cout<<"    TRANSLATION            ROTATION            DE TRANSLATION  \n";
   matdisp(translate,rotate,translate2);
   getch();
   matmulti(translate,rotate,output);
   matmulti(output,translate2,output2);
   matmulti(object,output2,output3);
   cout<<"\n output matrix is \n";
   matdisp(output3,n);
   cout<<endl;
   getch();
}
if(ch==5)
{ translate[2][1]=-240;
 translate[2][0]=0;
  translate[0][0]=1;
  translate[1][1]=1;
  translate[2][2]=1;
  cout<<"\nenter reflection matrix\n";
  input(mirror,3);
  matmulti(translate,mirror,output);
  translate[2][1]=240;
  matmulti(output,translate,output2);
  matmulti(object,output2,output3);
    cout<<"\n input matrix\n";
  matdisp(object,n);
  getch();
  cout<<"\n mirror matrix\n";
  matdisp(mirror,3);
  getch();
  cout<<"\n output matric\n";
  matdisp(output3,n);
  getch();
}
if(ch==6)
{ translate[2][0]=-320;
 translate[2][1]=0;
  translate[0][0]=1;
  translate[1][1]=1;
  translate[2][2]=1;
  cout<<"\nenter reflection matrix\n";
  input(mirror,3);
  matmulti(translate,mirror,output);
  translate[2][0]=320;
  matmulti(output,translate,output2);
  matmulti(object,output2,output3);
  cout<<"\n input matrix\n";
  matdisp(object,n);
  getch();
  cout<<"\n mirror matrix\n";
  matdisp(mirror,3);
  getch();
  cout<<"\n output matric\n";
  matdisp(output3,n);
  getch();
}
 initgraph(&gd,&gm,"");
 display(object);
 setcolor(12);
 display(output3);
 if(ch==5||ch==6)
 {setcolor(10);
  line(0,240,640,240);
  setcolor(11);
  line(320,0,320,480);
 }
 getch();
 closegraph();
 init(output);
 init(output2);
 init(output3);
 cout<<"\n want to go to main menu  (y/n)\n";
 choice=getche();
}while(choice!='n');
  return 0;
}