C Source Code
#include <graphics.h>
#include <conio.h>
#include <complex.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
struct {
int x,y,z;
} pnt[10],pnts[10][5];
int numverts,numfaces,col[10],colr[10][5],face[10][5],numpnts[10];
int bxresult,mousex,mousey,movex,movey,mx,my;
float orderbit[5],order[5],bit;
int numbits=4;
#define VGA_INPUT_STATUS_1 0x3DA
#define VGA_SYNC_MASK 0x08
void pageone(void);
void pagetwo(void);
void pol1(void);
void pol2(void);
void pol3(void);
void pol4(void);
void pol5(void);
void initmouse(void);
void readmouse(void);
void mousemove(void);
void vwait(void);
void main(void)
{
int polarr[17],num;
int s,i;
int gd,gm;
float x,y,z,x1,y1,z1,x2,y2,z2,x3,y3,z3,xp,yp,zp,xy,yy,zy,total,temp;
int loop,vec0,vec1,vec2,loop3,xy2,yy2,zy2,ozx2,vx2,loop22;
float xo[5],yo[5],ozx;
float dist[5];
float xang[5],yang[5],zang[5];
float d,loop2,vx,ax,ay,bx,by,resvec ;
float sxa,sya,cxa,cya,sza,cza;
short int sinvals[256];
short int cosvals[256];
gd=VGA;
gm=VGAMED;
initgraph(&gd,&gm,"c:\bc5\bgi");
loop=0;
loop=0;
do {
sinvals[loop]=sin(loop*(M_PI/64))*128;
loop+=1;
} while (loop<256);
loop=0;
do {
cosvals[loop]=cos(loop*(M_PI/64))*128;
loop+=1;
} while (loop<256);
d=500;
s=0;
loop=-1;
do {
loop++;
dist[loop]=500;
xo[loop]=320;
yo[loop]=100;
xang[loop]=0;
yang[loop]=0;
zang[loop]=0;
} while (loop<5);
xo[1]=320;
yo[1]=175;
xo[2]=320;
yo[2]=175;
xo[3]=320;
yo[3]=175;
xo[4]=320;
yo[4]=175;
do {
s=1-s;
if (s==1) pageone();
if (s==0) pagetwo();
vwait();
cleardevice();
loop=0;
do {
loop++;
xang[loop]=xang[loop]+1;
yang[loop]=yang[loop]-1;
zang[loop]=zang[loop]-1;
} while (loop<numbits);
loop=0;
i=0;
do {
i++;
orderbit[i]=0;
if (i==1) pol1();
if (i==2) pol2();
if (i==3) pol3();
if (i==4) pol4();
if (i==5) pol5();
if (xang[i]>127)xang[i]=xang[i]-128;
if (xang[i]<0) xang[i]=xang[i]+127;
if (yang[i]>127) yang[i]=yang[i]-128;
if (yang[i]<0) yang[i]=yang[i]+127;
if (zang[i]>127) zang[i]=zang[i]-128;
if (zang[i]<0) zang[i]=zang[i]+127;
xy=xang[i];
yy=yang[i];
zy=zang[i];
xy2=xy;
yy2=yy;
zy2=zy;
sxa = sinvals[xy2];
cxa = cosvals[xy2];
sya = sinvals[yy2];
cya = cosvals[yy2];
sza = sinvals[zy2];
cza = cosvals[zy2];
loop=0;
sxa = sxa /128;
cxa = cxa /128;
sya = sya /128;
cya = cya /128;
sza = sza /128;
cza = cza /128;
xp=0;
yp=0;
zp=0;
do {
loop=loop+1;
x = pnt[loop].x+xp;
y = pnt[loop].y+yp;
z = pnt[loop].z+zp;
x1 = (x * cza) - (y * sza);
y1 = (x * sza) + (y * cza);
z1 = z;
x2 = x1;
y2 = (y1 * cxa) - (z1 * sxa);
z2 = (y1 * sxa) + (z1 * cxa);
x3 = (z2 * sya) + (x2 * cya);
y3 = y2;
z3 = (z2 * cya) - (x2 * sya);
z3 = z3*2;
z3 = z3 - dist[i];
if (z3==0) z3=-1;
if (z3>0) {
z3=-1;
}
pnts[loop][i].x = (d * x3 / z3);
pnts[loop][i].y = ((d * y3 / z3) *0.7);
orderbit[i]=orderbit[i]+z3;
colr[loop][i]=col[loop];
} while (loop<numverts);
orderbit[i]=orderbit[i]/numverts;
} while (i<numbits);
loop=0;
i=0;
do {
loop++;
order[loop]=orderbit[loop];
} while (loop<numbits);
loop=0;
total=numbits;
do {
loop=1;
do {
loop++;
if (order[loop]<order[loop-1]) {
temp=order[loop-1];
order[loop-1]=order[loop];
order[loop]=temp;
}
} while (loop<numbits);
total=total-1;
} while (total>0);
loop=0;
i=0;
bit=0;
do {
i++;
loop=0;
do {
loop++;
if (order[i]==orderbit[loop]) {
if (bit!=loop) {
order[i]=loop;
bit=loop;
}
}
} while (loop<numbits);
} while (i<numbits);
loop=0;
i=0;
textcolor(15);
gotoxy(1,1);
do {
i++;
loop=0;
if (order[i]==1) {
pol1();
}
if (order[i]==2) {
pol2();
}
if (order[i]==3) {
pol3();
}
if (order[i]==4) {
pol4();
}
if (order[i]==5) {
pol5();
}
i=i;
do {
ozx=order[i];
loop=loop+1;
vec0=face[loop] [1];
vec1=face[loop] [2];
vec2=face[loop] [3];
ozx2=ozx;
ax=pnts[vec0][ozx2].x - pnts[vec1][ozx2].x;
ay=pnts[vec0][ozx2].y - pnts[vec1][ozx2].y;
bx=pnts[vec2][ozx2].x - pnts[vec1][ozx2].x;
by=pnts[vec2][ozx2].y - pnts[vec1][ozx2].y;
resvec=ax * by - ay * bx;
loop2=0;
loop3=0;
vx=face[loop][numpnts[loop]];
ozx2=ozx;
setfillstyle(1,colr[loop][ozx2]);
setcolor(colr[loop][ozx2]);
num=numpnts[loop];
num=(num*2);
if (resvec>=0) {
do {
loop3=loop3+1;
vx=face[loop][loop3];
ozx2=ozx;
vx2=vx;
loop22=loop2;
polarr[loop22]=(pnts[vx2][ozx2].x+xo[ozx2]);
loop2=loop2+1;
loop22=loop2;
polarr[loop22]=(pnts[vx2][ozx2].y+yo[ozx2]);
loop2=loop2+1;
} while (loop2<num);
fillpoly(numpnts[loop],polarr);
}
} while (loop<numfaces);
} while (i<numbits);
} while (!kbhit());
closegraph();
}
void pageone(void)
{
setactivepage(0);
setvisualpage(1);
}
void pagetwo(void)
{
setactivepage(1);
setvisualpage(0);
}
void pol1(void)
{
pnt[1].x=-40;
pnt[1].y=40;
pnt[1].z=40;
pnt[2].x=-40;
pnt[2].y=-40;
pnt[2].z=40;
pnt[3].x=-60;
pnt[3].y=-30;
pnt[3].z=40;
pnt[4].x=-60;
pnt[4].y=30;
pnt[4].z=40;
pnt[5].x=-40;
pnt[5].y=40;
pnt[5].z=-40;
pnt[6].x=-40;
pnt[6].y=-40;
pnt[6].z=-40;
pnt[7].x=-60;
pnt[7].y=-30;
pnt[7].z=-40;
pnt[8].x=-60;
pnt[8].y=30;
pnt[8].z=-40;
numverts=8;
{
numpnts[1]=4;
face[1][1]=1;
face[1][2]=2;
face[1][3]=3;
face[1][4]=4;
col[1]=3;
numpnts[2]=4;
face[2][1]=8;
face[2][2]=7;
face[2][3]=6;
face[2][4]=5;
col[2]=3;
numpnts[3]=4;
face[3][1]=3;
face[3][2]=7;
face[3][3]=8;
face[3][4]=4;
col[3]=2;
numpnts[4]=4;
face[4][1]=6;
face[4][2]=2;
face[4][3]=1;
face[4][4]=5;
col[4]=2;
numpnts[5]=4;
face[5][1]=1;
face[5][2]=4;
face[5][3]=8;
face[5][4]=5;
col[5]=1;
numpnts[6]=4;
face[6][1]=3;
face[6][2]=2;
face[6][3]=6;
face[6][4]=7;
col[6]=1;
}
numfaces=6;
}
void pol2(void)
{
pnt[1].x=40;
pnt[1].y=40;
pnt[1].z=40;
pnt[2].x=40;
pnt[2].y=-40;
pnt[2].z=40;
pnt[3].x=60;
pnt[3].y=-30;
pnt[3].z=40;
pnt[4].x=60;
pnt[4].y=30;
pnt[4].z=40;
pnt[5].x=40;
pnt[5].y=40;
pnt[5].z=-40;
pnt[6].x=40;
pnt[6].y=-40;
pnt[6].z=-40;
pnt[7].x=60;
pnt[7].y=-30;
pnt[7].z=-40;
pnt[8].x=60;
pnt[8].y=30;
pnt[8].z=-40;
numverts=8;
{
numpnts[1]=4;
face[1][1]=4;
face[1][2]=3;
face[1][3]=2;
face[1][4]=1;
col[1]=3;
numpnts[2]=4;
face[2][1]=5;
face[2][2]=6;
face[2][3]=7;
face[2][4]=8;
col[2]=3;
numpnts[3]=4;
face[3][1]=4;
face[3][2]=8;
face[3][3]=7;
face[3][4]=3;
col[3]=2;
numpnts[4]=4;
face[4][1]=5;
face[4][2]=1;
face[4][3]=2;
face[4][4]=6;
col[4]=2;
numpnts[5]=4;
face[5][1]=5;
face[5][2]=8;
face[5][3]=4;
face[5][4]=1;
col[5]=1;
numpnts[6]=4;
face[6][1]=7;
face[6][2]=6;
face[6][3]=2;
face[6][4]=3;
col[6]=1;
}
numfaces=6;
}
void pol3(void)
{
pnt[1].x=10;
pnt[1].y=10;
pnt[1].z=120;
pnt[2].x=10;
pnt[2].y=-10;
pnt[2].z=120;
pnt[3].x=-10;
pnt[3].y=-10;
pnt[3].z=120;
pnt[4].x=-10;
pnt[4].y=10;
pnt[4].z=120;
pnt[5].x=10;
pnt[5].y=10;
pnt[5].z=-100;
pnt[6].x=10;
pnt[6].y=-10;
pnt[6].z=-100;
pnt[7].x=-10;
pnt[7].y=-10;
pnt[7].z=-100;
pnt[8].x=-10;
pnt[8].y=10;
pnt[8].z=-100;
numverts=8;
{
/*numpnts[6]=4;
face[6][1]=1;
face[6][2]=2;
face[6][3]=3;
face[6][4]=4;
col[6]=3;*/
numpnts[1]=4;
face[1][1]=8;
face[1][2]=7;
face[1][3]=6;
face[1][4]=5;
col[1]=1;
numpnts[2]=4;
face[2][1]=3;
face[2][2]=7;
face[2][3]=8;
face[2][4]=4;
col[2]=3;
numpnts[3]=4;
face[3][1]=6;
face[3][2]=2;
face[3][3]=1;
face[3][4]=5;
col[3]=3;
numpnts[4]=4;
face[4][1]=1;
face[4][2]=4;
face[4][3]=8;
face[4][4]=5;
col[4]=2;
numpnts[5]=4;
face[5][1]=3;
face[5][2]=2;
face[5][3]=6;
face[5][4]=7;
col[5]=2;
}
numfaces=5;
}
void pol4(void)
{
pnt[1].x=-10;
pnt[1].y=-10;
pnt[1].z=120;
pnt[2].x=-10;
pnt[2].y=10;
pnt[2].z=120;
pnt[3].x=10;
pnt[3].y=10;
pnt[3].z=120;
pnt[4].x=10;
pnt[4].y=-10;
pnt[4].z=120;
pnt[5].x=-15;
pnt[5].y=-15;
pnt[5].z=140;
pnt[6].x=-15;
pnt[6].y=15;
pnt[6].z=140;
pnt[7].x=15;
pnt[7].y=15;
pnt[7].z=140;
pnt[8].x=15;
pnt[8].y=-15;
pnt[8].z=140;
pnt[9].x=0;
pnt[9].y=0;
pnt[9].z=200;
numverts=9;
{
numpnts[1]=3;
face[1][1]=5;
face[1][2]=6;
face[1][3]=9;
col[1]=3;
numpnts[2]=3;
face[2][1]=6;
face[2][2]=7;
face[2][3]=9;
col[2]=2;
numpnts[3]=3;
face[3][1]=7;
face[3][2]=8;
face[3][3]=9;
col[3]=3;
numpnts[4]=3;
face[4][1]=8;
face[4][2]=5;
face[4][3]=9;
col[4]=2;
numpnts[5]=4;
face[5][1]=6;
face[5][2]=5;
face[5][3]=1;
face[5][4]=2;
col[5]=2;
numpnts[6]=4;
face[6][1]=2;
face[6][2]=3;
face[6][3]=7;
face[6][4]=6;
col[6]=3;
numpnts[7]=4;
face[7][1]=3;
face[7][2]=4;
face[7][3]=8;
face[7][4]=7;
col[7]=2;
numpnts[8]=4;
face[8][1]=4;
face[8][2]=1;
face[8][3]=5;
face[8][4]=8;
col[8]=3;
}
numfaces=8;
}
void pol5(void)
{
pnt[1].x=-15;
pnt[1].y=-15;
pnt[1].z=140;
pnt[2].x=-40;
pnt[2].y=40;
pnt[2].z=40;
numverts=2;
{
numpnts[1]=2;
face[1][1]=1;
face[1][2]=2;
col[1]=15;
}
numfaces=1;
}
void vwait(void)
{
while(inp(VGA_INPUT_STATUS_1) & VGA_SYNC_MASK)
{
}
while(!(inp(VGA_INPUT_STATUS_1) & VGA_SYNC_MASK))
{
}
}