C++ Programming Blog

 
 
 
 # include <iostream.h>
 # include <graphics.h>
 # include    <conio.h>
 # include     <math.h>


 # define  f                 0.3
 # define  projection_angle   45


 void show_screen( );

 void apply_translation(int[8][3],const int,const int,const int);
 void multiply_matrices(const float[4],const float[4][4],float[4]);

 void draw_cube(int [8][3]);
 void get_projected_point(int&,int&,int&);

 void Line(const int,const int,const int,const int);


 int main( )
    {
       int driver=VGA;
       int mode=VGAHI;

       initgraph(&driver,&mode,\"..\\\\Bgi\");

       show_screen( );

       int cube[8][3]={
             {270,200,50},      //  front left top
             {370,200,50},      //  front right top
             {370,300,50},      //  front right bottom
             {270,300,50},      //  front left bottom
             {270,200,-50},     //  back left top
             {370,200,-50},     //  back right top
             {370,300,-50},     //  back right bottom
             {270,300,-50}      //  back left bottom
              };

       setcolor(15);
     draw_cube(cube);

       setcolor(15);
       settextstyle(0,0,1);
     outtextxy(50,415,\"*** Use Arrows, + & - Keys to apply Translation.\");

       int key_code_1=0;
       int key_code_2=0;

       char Key_1=NULL;
       char Key_2=NULL;

       do
      {
         Key_1=NULL;
         Key_2=NULL;
         key_code_1=0;
         key_code_2=0;

         Key_1=getch( );
         key_code_1=int(Key_1);

         if(key_code_1==0)
        {
           Key_2=getch( );
           key_code_2=int(Key_2);
        }

         if(key_code_1==27)
        break;

         else if(key_code_1==43)
        {
           setfillstyle(1,0);
             bar(40,70,600,410);

           apply_translation(cube,0,0,25);

           setcolor(7);
             draw_cube(cube);
        }

         else if(key_code_1==45)
        {
           setfillstyle(1,0);
             bar(40,70,600,410);

           apply_translation(cube,0,0,-25);

           setcolor(8);
             draw_cube(cube);
        }

         else if(key_code_1==0)
        {
           if(key_code_2==72)
              {
             setfillstyle(1,0);
               bar(40,70,600,410);

             apply_translation(cube,0,-25,0);

             setcolor(10);
               draw_cube(cube);
              }

           else if(key_code_2==75)
              {
             setfillstyle(1,0);
               bar(40,70,600,410);

             apply_translation(cube,-25,0,0);

             setcolor(12);
               draw_cube(cube);
              }

           else if(key_code_2==77)
              {
             setfillstyle(1,0);
               bar(40,70,600,410);

             apply_translation(cube,25,0,0);

             setcolor(14);
               draw_cube(cube);
              }

           else if(key_code_2==80)
              {
             setfillstyle(1,0);
               bar(40,70,600,410);

             apply_translation(cube,0,25,0);

             setcolor(9);
               draw_cube(cube);
              }
        }
      }
       while(1);

       return 0;
    }



 //------------------------  apply_translation( )  -----------------------//


 void apply_translation(int edge_points[8][3],
                     const int Tx,const int Ty,const int Tz)
    {
       for(int count=0;count<8;count++)
      {
         float matrix_a[4]={edge_points[count][0],edge_points[count][1],
                            edge_points[count][2],1};
         float matrix_b[4][4]={ { 1,0,0,0 } , { 0,1,0,0 } ,
                  { 0,0,1,0 } ,{ Tx,Ty,Tz,1 } };
         float matrix_c[4]={0};

         multiply_matrices(matrix_a,matrix_b,matrix_c);

         edge_points[count][0]=(int)(matrix_c[0]+0.5);
         edge_points[count][1]=(int)(matrix_c[1]+0.5);
         edge_points[count][2]=(int)(matrix_c[2]+0.5);
      }
    }

 /************************************************************************/
 //----------------------  multiply_matrices( )  ------------------------//
 /************************************************************************/

 void multiply_matrices(const float matrix_1[4],
                  const float matrix_2[4][4],float matrix_3[4])
    {
       for(int count_1=0;count_1<4;count_1++)
      {
         for(int count_2=0;count_2<4;count_2++)
        matrix_3[count_1]+=
               (matrix_1[count_2]*matrix_2[count_2][count_1]);
      }
    }

 /************************************************************************/
 //----------------------------  draw_cube( )  --------------------------//
 /************************************************************************/

 void draw_cube(int edge_points[8][3])
    {
       for(int i=0;i<8;i++)
      get_projected_point(edge_points[i][0],
                     edge_points[i][1],edge_points[i][2]);

     Line(edge_points[0][0],edge_points[0][1],
                     edge_points[1][0],edge_points[1][1]);
     Line(edge_points[1][0],edge_points[1][1],
                     edge_points[2][0],edge_points[2][1]);
     Line(edge_points[2][0],edge_points[2][1],
                     edge_points[3][0],edge_points[3][1]);
     Line(edge_points[3][0],edge_points[3][1],
                     edge_points[0][0],edge_points[0][1]);

     Line(edge_points[4][0],edge_points[4][1],
                     edge_points[5][0],edge_points[5][1]);
     Line(edge_points[5][0],edge_points[5][1],
                     edge_points[6][0],edge_points[6][1]);
     Line(edge_points[6][0],edge_points[6][1],
                     edge_points[7][0],edge_points[7][1]);
     Line(edge_points[7][0],edge_points[7][1],
                     edge_points[4][0],edge_points[4][1]);


     Line(edge_points[0][0],edge_points[0][1],
                      edge_points[4][0],edge_points[4][1]);
     Line(edge_points[1][0],edge_points[1][1],
                      edge_points[5][0],edge_points[5][1]);
     Line(edge_points[2][0],edge_points[2][1],
                      edge_points[6][0],edge_points[6][1]);
     Line(edge_points[3][0],edge_points[3][1],
                      edge_points[7][0],edge_points[7][1]);
    }

 /************************************************************************/
 //---------------------  get_projected_point( )  -----------------------//
 /************************************************************************/

 void get_projected_point(int& x,int& y,int& z)
    {
       float fcos0=(f*cos(projection_angle*(M_PI/180)));
       float fsin0=(f*sin(projection_angle*(M_PI/180)));

       float Par_v[4][4]={
                {1,0,0,0},
                {0,1,0,0},
                {fcos0,fsin0,0,0},
                {0,0,0,1}
             };

       float xy[4]={x,y,z,1};
       float new_xy[4]={0};

       multiply_matrices(xy,Par_v,new_xy);

       x=(int)(new_xy[0]+0.5);
       y=(int)(new_xy[1]+0.5);
       z=(int)(new_xy[2]+0.5);
    }


 //-------------------------------  Line( )  -----------------------------//


 void Line(const int x_1,const int y_1,const int x_2,const int y_2)
    {
       int color=getcolor( );

       int x1=x_1;
       int y1=y_1;

       int x2=x_2;
       int y2=y_2;

       if(x_1>x_2)
      {
         x1=x_2;
         y1=y_2;

         x2=x_1;
         y2=y_1;
      }

       int dx=abs(x2-x1);
       int dy=abs(y2-y1);
       int inc_dec=((y2>=y1)?1:-1);

       if(dx>dy)
      {
         int two_dy=(2*dy);
         int two_dy_dx=(2*(dy-dx));
         int p=((2*dy)-dx);

         int x=x1;
         int y=y1;

         putpixel(x,y,color);

         while(x<x2)
        {
           x++;

           if(p<0)
              p+=two_dy;

           else
              {
             y+=inc_dec;
             p+=two_dy_dx;
              }

           putpixel(x,y,color);
        }
      }

       else
      {
         int two_dx=(2*dx);
         int two_dx_dy=(2*(dx-dy));
         int p=((2*dx)-dy);

         int x=x1;
         int y=y1;

         putpixel(x,y,color);

         while(y!=y2)
        {
           y+=inc_dec;

           if(p<0)
              p+=two_dx;

           else
              {
             x++;
             p+=two_dx_dy;
              }

           putpixel(x,y,color);
        }
      }
    }


 //--------------------------  show_screen( )  ---------------------------//


 void show_screen( )
    {
       setfillstyle(1,1);
     bar(205,26,430,38);

       settextstyle(0,0,1);
     setcolor(15);
       outtextxy(5,5,\"******************************************************************************\");
       outtextxy(5,17,\"*-**************************************************************************-*\");
       outtextxy(5,29,\"*----------------------                               -----------------------*\");
       outtextxy(5,41,\"*-**************************************************************************-*\");
       outtextxy(5,53,\"*-**************************************************************************-*\");

     setcolor(11);
       outtextxy(210,29,\"Translation Transformation\");

     setcolor(15);

       for(int count=0;count<=30;count++)
          outtextxy(5,(65+(count*12)),\"*-*                                                                        *-*\");

       outtextxy(5,438,\"*-**************************************************************************-*\");
       outtextxy(5,450,\"*-------------------------                          -------------------------*\");
       outtextxy(5,462,\"******************************************************************************\");

     setcolor(12);
       outtextxy(229,450,\"Press any Key to exit.\");
    }

 
 
Didn't find what you were looking for? Find more on Program to illustrate the implementation of Translation Transformation