#include "stdio.h"
#include "math.h"
#include "graphics.h"
int driver=DETECT,mode;
int v3[3][8]={100,150,100,150,100,150,100,150,100,100,150,150,100,100,150,150,
100,100,100,100,150,150,150,150};
void drawline(int pp[2][8])/*连接投影后的正方体各条边*/
{ setcolor(4);
line(pp[0][0],pp[1][0],pp[0][1],pp[1][1]);
line(pp[0][1],pp[1][1],pp[0][3],pp[1][3]);
line(pp[0][3],pp[1][3],pp[0][2],pp[1][2]);
line(pp[0][2],pp[1][2],pp[0][0],pp[1][0]);
line(pp[0][4],pp[1][4],pp[0][5],pp[1][5]);
line(pp[0][5],pp[1][5],pp[0][7],pp[1][7]);
line(pp[0][7],pp[1][7],pp[0][6],pp[1][6]);
line(pp[0][6],pp[1][6],pp[0][4],pp[1][4]);
setcolor(5);
line(pp[0][3],pp[1][3],pp[0][7],pp[1][7]);
line(pp[0][1],pp[1][1],pp[0][5],pp[1][5]);
line(pp[0][2],pp[1][2],pp[0][6],pp[1][6]);
line(pp[0][0],pp[1][0],pp[0][4],pp[1][4]);
}
void toushi(int v3[3][8])/*对立方体进行透视投影*/
{int v2[2][8];
int i;
int xc=125;int yc=125;int zc=200;/*视点*/
for(i=0;i<8;i++)
{ v2[0][i]=xc+(v3[0][i]-xc)*zc/(zc-v3[2][i]);
v2[1][i]=yc+(v3[1][i]-yc)*zc/(zc-v3[2][i]);
}
drawline(v2);
}
void pingxing(int v3[3][8])/*对立方体进行平行投影*/
{int v2[2][8];
int i;
int x0=200;int y0=180;int z0=-50;/*投影方向*/
for(i=0;i<8;i++)
{v2[0][i]=v3[0][i]-(x0/z0)*v3[2][i];
v2[1][i]=v3[1][i]-(y0/z0)*v3[2][i];
}
drawline(v2);
}
void move(int a[3][8],int d1,int d2,int d3)/*对立方体进行平移,在x y z三个方向分别平移 d1 d2 d3*/
{int i;
for(i=0;i<8;i++)
{a[0][i]=a[0][i]+d1;
a[1][i]=a[1][i]+d2;
a[2][i]=a[2][i]+d3;
}
}
void xuanzhuan(int a[3][8], char zhou)/*对立方体进行旋转,zhou 代表绕哪个轴转*/
{int i;
for(i=0;i<8;i++)
{if(zhou=='x')
{a[2][i]=cos(0.02)*a[2][i]+sin(0.02)*a[1][i];
a[1][i]=cos(0.02)*a[1][i]-sin(0.02)*a[2][i];
}
else if(zhou=='y')
{a[0][i]=cos(0.02)*a[0][i]+sin(0.02)*a[2][i];
a[2][i]=cos(0.02)*a[2][i]-sin(0.02)*a[0][i];
}
else if(zhou=='z')
{a[0][i]=cos(0.02)*a[0][i]-sin(0.02)*a[1][i];
a[1][i]=sin(0.02)*a[0][i]+cos(0.02)*a[1][i];
}
else return;
}
}
void fs(int v3[3][8],float xsh)/*对立方体以系数xsh进行放缩*/
{int i;
for(i=0;i<8;i++)
{v3[0][i]=v3[0][i]*xsh;
v3[1][i]=v3[1][i]*xsh;
v3[2][i]=v3[2][i]*xsh;
}
}
main()
{
char v;
initgraph(&driver,&mode,"c:\\tc");
while(1)
{ cleardevice();
toushi(v3);
v=getch();
switch(v)
{ case 'l':/*左移*/
move(v3,10,0,0);
break;
case 'r':/*右移*/
move(v3,-10,0,0);
break;
case 'u':/*上*/
move(v3,0,10,0);
break;
xxxxxxcase 'd':/*下移*/
move(v3,0,-10,0);
break;
case 'x':/*绕x转*/
xuanzhuan(v3,'x');
break;
case 'y':/*绕y转*/
xuanzhuan(v3,'y');
break;
case 'z':/*绕z转*/
xuanzhuan(v3,'z');
break;
case 'f':/*放3倍*/
fs(v3,3);
break;
case 's':/*缩成1/3*/
fs(v3,1./3);
break;
default: return;
}
}
}