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))

{

}

 

}