A Graphics Illustration Program

Source Code


#include<stdio.h>
#include<iostream.h>
#include<dos.h>
#include<process.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>
//void render(float,float,float, float,float,float, float,float,float,
float,float,float);
void initialize(void);
void firstpage(void);
void call_first(void);
float intensity,alpha,thita,tempy,tempz,tempx;
char ch='4';
char ch1='1';
char ch2='1';
int pts1[5][3];
float tx,ty,tz,d=.5;
void assign(float,float,float,float,float,float,float,float,float);
void scan_line(float,float,float,float,float,float,float,float,float);
void drawpyramid(float,float,float,float,float,float);
void call_assign(void);
void display(void);
void tranform(void);
void draw(void);
void drawscale(void);
float pts[5][3]={-100,0,0, 0,0,45, 100,0,0, 0,0,-45, 0,130,0};
float pts2[5][3]={228,273,0, 305,295,0, 428,273,0, 350,250,0 ,328,143,0};
float pt[5][3]={-100,0,0, 0,0,45,100,0,0,0,0-45,0,130,0};

void main()
{
 int i;
 float sx,sy,sz=1;
 struct palettetype pal;
 int gd,gm;
 detectgraph(&gd,&gm);
                initgraph(&gd,&gm,"d:\backups\borlandc\bgi");
 getpalette(&pal);
 firstpage();
 for(i=16;i>0;i--)
                                 setrgbpalette(pal.colors[i],0,4*i,0);


L1: display();

while(ch1!='4')
{
 ch='2';
 L2:    call_assign();
 clearviewport();
 gotoxy(1,2);
 cout<<"1. Translation
";
 cout<<"2. Rotation
";
 cout<<"3. Scaling
";
 cout<<"4. Back
";
 ch1=getch();
 if(ch1=='4')
 {
                 clearviewport();
                 goto L1;
 }

 if(ch1=='1')
 {
 clearviewport();
 while(ch1!='4')
 {
                 gotoxy(2,2);
                 cout<<"a. X+
";  cout<<" b. X-
";
                 cout<<" c. Y+
"; cout<<" d. Y-
";
                 cout<<" e. Z+
"; cout<<" f. Z-
";
                 cout<<" g. Back";
                 call_assign();
                 ch1=getch();
                 clearviewport();
                 if(ch1=='g')
                 goto L2;
                 if(ch1=='a')
                  tx=5;
                 if(ch1=='b')
                  tx=-5;
                 if(ch1=='c')
                  ty=5;
                 if(ch1=='d')
                  ty=-5;
                 if(ch1=='e')
                  tz=10;
                 if(ch1=='f')
                  tz=-10;

                 for(i=0;i<5;i++)
                  {
                pts[i][0]+=tx;
                pts[i][1]+=ty;
                pts[i][1]+=tz;
                  }
                }
                }
                if(ch1=='3')
                {
                                 clearviewport();
                                 cout<<"Enter sx:";
                                 cin>>sx;
                                 cout<<"Enter sy:";
                                 cin>>sy;
                                 for(i=0;i<5;i++)
                                 {
                 pts2[i][0]=abs(pts2[i][0]*sx+200*(1-sx));
                 pts2[i][1]=abs(pts2[i][1]*sy+200*(1-sy));
                                 }
                                 drawscale();
                                 getch();
                }

if(ch1=='2')
{
                while(ch2!='4')
                {
                clearviewport();
                gotoxy(1,2);
                cout<<"1.X-axis rotation
";
                gotoxy(1,3);
                cout<<"2.Y-axis rotation
";
                gotoxy(1,4);
                cout<<"3.Z-axis rotation
";
                gotoxy(1,5);
                cout<<"4.Back";
                ch2=getch();
                if(ch2=='4')
                                  break;
                if(ch2=='1')
                                  {
                  alpha=0;
                  while(alpha<360)
                  {
                                   alpha=alpha+10;
                                   thita=(alpha*3.142)/180;
                                   initialize();
                                   for(i=0;i<5;i++)
                                   {
                                  tempy=(pts1[i][1]*cos(thita)+pts1[i][2]*sin(thita));
                                  pts1[i][2]=(pts1[i][1]*sin(thita)-pts1[i][2]*cos(thita));
                                  pts1[i][1]=tempy;
                                   }
                                  clearviewport();
                                  draw();
                                  delay(100);
                 }
                                 }

                                  if(ch2=='2')
                                  {
                  alpha=0;
                  while(alpha<360)
                  {
                                   alpha=alpha+10;
                                   thita=(alpha*3.142)/180;
                                   initialize();
                                   for(i=0;i<5;i++)
                                   {
                                  tempz=(pts1[i][2]*cos(thita)+pts1[i][0]*sin(thita));
                                  pts1[i][0]=(pts1[i][2]*sin(thita)-pts1[i][0]*cos(thita));
                                  pts1[i][2]=tempz;
                                   }
                                  clearviewport();
                                  draw();
                                  delay(100);
                 }
                                 }

                if(ch2=='3')
                {
                                 alpha=0;
                                 while(alpha<360)
                                 {
                                                  alpha=alpha+10;
                                                  thita=(alpha*3.142)/180;
                                                  initialize();
                                                  for(i=0;i<5;i++)
                                                  {
                                  tempx=(pts1[i][0]*cos(thita)-pts1[i][1]*sin(thita));
                                  pts1[i][1]=(pts1[i][0]*sin(thita)+pts1[i][1]*cos(thita));
                                  pts1[i][0]=tempx;
                                                  }
                                                  clearviewport();
                                                  draw();
                                                  delay(100);
                                                  clearviewport();
                                                  draw();
                  }
                                  }

}
}
}
closegraph();
restorecrtmode();
}
void initialize()
{
 pts1[0][0]=-100;
 pts1[0][1]=-65;
 pts1[0][2]=0;
 pts1[1][0]=0;
 pts1[1][1]=-65;
 pts1[1][2]=-45;
 pts1[2][0]=100;
 pts1[2][1]=-65;
 pts1[2][2]=0;
 pts1[3][0]=0;
 pts1[3][1]=-65;
 pts1[3][2]=45;
 pts1[4][0]=0;
 pts1[4][1]=65;
 pts1[4][2]=0;

}

void firstpage()
{
                clearviewport();
                setcolor(WHITE);
                settextstyle(2,HORIZ_DIR,5);
                outtextxy(250,15,"A Project on");
                setcolor(GREEN);
                settextstyle(3,HORIZ_DIR,4);
                outtextxy(170,25,"PYRAMID MODELING");
                rectangle(300,120,580,320);
                rectangle(295,115,585,325);
                setcolor(6);
                settextstyle(4,HORIZ_DIR,3);
                outtextxy(50,100, "OPTIONS");
                settextstyle(3,HORIZ_DIR,1);
                setcolor(11);
                outtextxy(20,150,"1. VISIBLE SURFACE DETECTION");
                outtextxy(20,190,"2. SURFACE RENDERING");
                outtextxy(20,230,"3. TRANSFORMATIONS");
                outtextxy(20,270,"4. WIREFRAME DISPLAY");
                outtextxy(20,310,"5. EXIT");
                settextstyle(2,HORIZ_DIR,4);
                outtextxy(400,370,"Group Memebers");
                setcolor(YELLOW);
               call_first();
                //display();
                setcolor(WHITE);
                getch();
                cleardevice();
                clearviewport();

}

void display(void)
{ while(ch!='3')
 {   clearviewport();
                                 gotoxy(2,2);
                                 cout<<"1. Visible Surface Detection
";
                                 gotoxy(2,3);
                                 cout<<"2. Surface Rendering
";
                                 gotoxy(2,4);
                                 cout<<"3. Transformations";
                                 gotoxy(2,5);
                                 cout<<"4. Wireframe Display
";
                                 gotoxy(2,6);
                                 cout<<"5. Exit
";
                                 call_assign();
                                 ch=getch();
                                 if(ch=='5')
                                 exit(0);
                                 clearviewport();
                                 if(ch=='3')
                                 break;
 }
}
void call_assign(void)
{
assign(pts[0][0],pts[0][1],pts[0][2],pts[1][0],pts[1][1],pts[1][2],pts[4][
0],pts[4][1],pts[4][2]);

assign(pts[1][0],pts[1][1],pts[1][2],pts[2][0],pts[2][1],pts[2][2],pts[4][
0],pts[4][1],pts[4][2]);

assign(pts[2][0],pts[2][1],pts[2][2],pts[3][0],pts[3][1],pts[3][2],pts[4][
0],pts[4][1],pts[4][2]);

assign(pts[0][0],pts[0][1],pts[0][2],pts[4][0],pts[4][1],pts[4][2],pts[3][
0],pts[3][1],pts[3][2]);
}
void call_first(void)
{
assign(pt[0][0],pt[0][1],pt[0][2],pt[1][0],pt[1][1],pt[1][2],pt[4][0],pt[4
][1],pt[4][2]);

assign(pt[1][0],pt[1][1],pt[1][2],pt[2][0],pt[2][1],pt[2][2],pt[4][0],pt[4
][1],pt[4][2]);

assign(pt[2][0],pt[2][1],pt[2][2],pt[3][0],pt[3][1],pt[3][2],pt[4][0],pt[4
][1],pt[4][2]);

assign(pt[0][0],pt[0][1],pt[0][2],pt[4][0],pt[4][1],pt[4][2],pt[3][0],pt[3
][1],pt[3][2]);
}






void drawpyramid(float x1,float y1,float x2,float y2,float x3,float y3)
{
 line(x1,y1,x2,y2);
 line(x2,y2,x3,y3);
 line(x3,y3,x1,y1);
}

void assign(float x1,float y1,float z1,float x2,float y2,float z2,float
x3,float y3,float z3)
{
 float A,B,C;
 float temp,An,Bn,Cn,X,Y,Z;
 float Xl=-6,Yl=10,Zl=50;
 float templ;


 A=y1*(z2-z3)+y2*(z3-z1)+y3*(z1-z2);
 B=z1*(x2-x3)+z2*(x3-x1)+z3*(x1-x2);
 C=x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2);

 temp=sqrt(A*A+B*B+C*C);
 templ=sqrt(Xl*Xl+Yl*Yl+Zl*Zl);

 X=(float)Xl/templ; Y=(float)Yl/templ; Z=(float)Zl/templ;
 An=(A/temp); Bn=(float)B/temp; Cn=(float)C/temp;

 intensity=15*(An*X+Bn*Y+Cn*Z);

 if (intensity<0)
 intensity=0;
 if (intensity>15)
 intensity=15;

z1=55-z1;
x1=x1+300+(d*z1); y1=300-y1-(d*z1);
z2=55-z2;
x2=x2+300+(d*z2); y2=300-y2-(d*z2);
z3=55-z3;
x3=x3+300+(d*z3); y3=300-y3-(d*z3);

 if(ch=='1')
 {  if(intensity==0)  return;
    drawpyramid(x1,y1,x2,y2,x3,y3);
    return;
 }
 if(ch=='3')
 exit(0);

 if(ch=='4')
 drawpyramid(x1,y1,x2,y2,x3,y3);

 if(ch=='2')
 {
    if(intensity==0)  return;
    if ((y1>y2) && (y1>y3) && (y2>y3))
    scan_line(x1,y1,z1,x2,y2,z2,x3,y3,z3);

    if ((y1>y2) && (y1>y3) && (y3>y2))
    scan_line(x1,y1,z1,x3,y3,z3,x2,y2,z2);

    if ((y2>y1) && (y2>y3) && (y1>y3))
    scan_line(x2,y2,z2,x1,y1,z1,x3,y3,z3);

    if ((y2>y1) && (y2>y3) && (y3>y1))
    scan_line(x2,y2,z2,x3,y3,z3,x1,y1,z1);

    if ((y3>y1) && (y3>y2) && (y1>y2))
    scan_line(x3,y3,z3,x1,y1,z1,x2,y2,z2);

    if ((y3>y1) && (y3>y2) && (y2>y1))
    scan_line(x3,y3,z3,x2,y2,z2,x1,y1,z1);
 }
}

void scan_line(float x1,float y1,float z1,float x2,float y2,float z2,float
x3,float y3,float z3)
{
 int i;
 float tempx,tempx1,tempy;
 float m1,m2,thita,alpha;
 alpha=0;

 tempx=x1; tempx1=x1; tempy=y1;
 m1=(y2-y1)/(x2-x1);
 m2=(y3-y1)/(x3-x1);

 while((int)tempy!=(int)y2)
 { alpha=alpha+5;
   thita=(alpha*3.14/180);
   tempx=tempx-1/m1;
   tempx1=tempx1-1/m2;
   if(tempx<tempx1)
   {
   for(i=0;i+tempx<=tempx1;i++)
      {
                  putpixel(tempx+i,tempy,intensity);
      }
   }
   else
   if (tempx1<tempx)
   { for(i=0;i+tempx1<=tempx;i++)
     {
     putpixel(tempx1+i,tempy,intensity);
     }
   }
    tempy--;
 }

 m1=(float)(y3-y2)/(x3-x2);

 while((int)tempy!=(int)y3)
 {
   tempx=tempx-1/m1;
   tempx1=tempx1-1/m2;
   if(tempx<tempx1)
   {
     for(i=0;i+tempx<=tempx1;i++)
     putpixel(tempx+i,tempy,intensity);
   }
   else
   {
      for(i=0;i+tempx1<=tempx;i++)
      putpixel(tempx1+i,tempy,intensity);
   }
   tempy--;
 }
}

void draw()
{   int i;
   for(i=0;i<5;i++)
   {
      pts1[i][2]=50+pts1[i][2]+50;
      pts1[i][0]=pts1[i][0]+300+.5*pts1[i][2];
      pts1[i][1]=200+65-pts1[i][1]-.5*pts1[i][2];
   }
   line(pts1[0][0],pts1[0][1],pts1[1][0],pts1[1][1]);
   line(pts1[1][0],pts1[1][1],pts1[2][0],pts1[2][1]);
   line(pts1[2][0],pts1[2][1],pts1[3][0],pts1[3][1]);
   line(pts1[3][0],pts1[3][1],pts1[0][0],pts1[0][1]);
   line(pts1[0][0],pts1[0][1],pts1[4][0],pts1[4][1]);
   line(pts1[1][0],pts1[1][1],pts1[4][0],pts1[4][1]);
   line(pts1[2][0],pts1[2][1],pts1[4][0],pts1[4][1]);
   line(pts1[3][0],pts1[3][1],pts1[4][0],pts1[4][1]);
}
void drawscale()
{
   line(pts2[0][0],pts2[0][1],pts2[1][0],pts2[1][1]);
   line(pts2[1][0],pts2[1][1],pts2[2][0],pts2[2][1]);
   line(pts2[2][0],pts2[2][1],pts2[3][0],pts2[3][1]);
   line(pts2[3][0],pts2[3][1],pts2[0][0],pts2[0][1]);
   line(pts2[0][0],pts2[0][1],pts2[4][0],pts2[4][1]);
   line(pts2[1][0],pts2[1][1],pts2[4][0],pts2[4][1]);
   line(pts2[2][0],pts2[2][1],pts2[4][0],pts2[4][1]);
   line(pts2[3][0],pts2[3][1],pts2[4][0],pts2[4][1]);
}

Comments

Popular posts from this blog

8086 STRING MANIPULATION –FIND AND REPLACE A WORD

Animated Circles In C++

C program to find out the sum of series 1 + 2 + …. + n.