#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <iostream.h>
float p[8][4]={0,0,0,100,
100,0,0,1,
0,100,0,1,
100,100,0,1,
0,0,100,1,
100,0,100,1,
0,100,100,1,
100,100,100,1};
void change(float b[4][4])
{
for (int i=0;i<8;i++)
{
float q[4];
q[0]=p[i][0]*b[0][0]+p[i][1]*b[0][1]+p[i][2]*b[0][2]+p[1][3]*b[0][3];
q[1]=p[i][0]*b[1][0]+p[i][1]*b[1][1]+p[i][2]*b[1][2]+p[1][3]*b[1][3];
q[2]=p[i][0]*b[2][0]+p[i][1]*b[2][1]+p[i][2]*b[2][2]+p[1][3]*b[2][3];
q[3]=p[i][0]*b[3][0]+p[i][1]*b[3][1]+p[i][2]*b[3][2]+p[1][3]*b[3][3];
for (int j=0;j<4;j++)
p[i][j]=q[j]/q[3];
}
}
void scale(float x, float y, float z)
{
float b[4][4]={x,0,0,0,0,y,0,0,0,0,z,0,0,0,0,1};
change(b);
}
void rotx(float a)
{
float b[4][4]={1,0,0,0,
0,cos(a),-sin(a),0,
0,sin(a),cos(a),0,
0,0,0,1};
change(b);
}
void roty(float a)
{
float b[4][4]={cos(a),0,sin(a),0,
0,1,0,0,
-sin(a),0,cos(a),0,
0,0,0,1};
change(b);
}
void rotz(float a)
{
float b[4][4]={cos(a),-sin(a),0,0,
sin(a),cos(a),0,0,
0,0,1,0,
0,0,0,1};
change(b);
}
void disp()
{
line(p[0][0]+getmaxx()/2,getmaxy()/2-p[0][1],p[1][0]+getmaxx()/2,getmaxy()/2-p[1][1]);
line(p[0][0]+getmaxx()/2,getmaxy()/2-p[0][1],p[2][0]+getmaxx()/2,getmaxy()/2-p[2][1]);
line(p[3][0]+getmaxx()/2,getmaxy()/2-p[3][1],p[1][0]+getmaxx()/2,getmaxy()/2-p[1][1]);
line(p[3][0]+getmaxx()/2,getmaxy()/2-p[3][1],p[2][0]+getmaxx()/2,getmaxy()/2-p[2][1]);
int c=4;
line(p[0+c][0]+getmaxx()/2,getmaxy()/2-p[0+c][1],p[1+c][0]+getmaxx()/2,getmaxy()/2-p[1+c][1]);
line(p[0+c][0]+getmaxx()/2,getmaxy()/2-p[0+c][1],p[2+c][0]+getmaxx()/2,getmaxy()/2-p[2+c][1]);
line(p[3+c][0]+getmaxx()/2,getmaxy()/2-p[3+c][1],p[1+c][0]+getmaxx()/2,getmaxy()/2-p[1+c][1]);
line(p[3+c][0]+getmaxx()/2,getmaxy()/2-p[3+c][1],p[2+c][0]+getmaxx()/2,getmaxy()/2-p[2+c][1]);
line(p[1][0]+getmaxx()/2,getmaxy()/2-p[1][1],p[1+c][0]+getmaxx()/2,getmaxy()/2-p[1+c][1]);
line(p[2][0]+getmaxx()/2,getmaxy()/2-p[2][1],p[2+c][0]+getmaxx()/2,getmaxy()/2-p[2+c][1]);
line(p[3][0]+getmaxx()/2,getmaxy()/2-p[3][1],p[3+c][0]+getmaxx()/2,getmaxy()/2-p[3+c][1]);
line(p[4][0]+getmaxx()/2,getmaxy()/2-p[4][1],p[4+c][0]+getmaxx()/2,getmaxy()/2-p[4+c][1]);
}
void main()
{
int gd=DETECT, gm=VGAHI;
initgraph(&gd,&gm,"");
char cho='1';
disp();
while (cho!='0')
{
cout<<"Enter choice ";
cin>>cho;
float ang;
switch (cho)
{
case '1':
float x,y,z;
cout<<"Enter x,y,z";
cin>>x>>y>>z;
scale(x,y,z);
break;
case '2':
cout<<"Enter x angle ";
cin>>ang;
ang*=M_PI/180;
rotx(ang);
break;
case '3':
cout<<"Enter y angle ";
cin>>ang;
ang*=M_PI/180;
roty(ang);
break;
case '4':
cout<<"Enter z angle ";
cin>>ang;
ang*=M_PI/180;
rotz(ang);
break;
}
cleardevice();
disp();
}
getch();
}