1 /***************************************************************************/
2 /*                                                                         */
3 /*  3D Rotating Cube. Created for Amiga and PC by Stefan Henrikson 1993.   */
4 /*                                                                         */
5 /*  Modified for Z88 BASIC 1993, SmallC+ Z88 1998 by Dennis Groning.       */
6 /*                                                                         */
7 /***************************************************************************/
8 
9 #include <stdio.h>
10 #include <math.h>
11 #include <graphics.h>
12 
13 #define MAX_X   256.0
14 #define MAX_Y   192.0
15 #define NODES     8
16 #define SIZE     24.0
17 
18 /* djm speed ups */
19 
20 #define MAX_X2  128.0
21 #define MAX_Y2   32.0
22 
main()23 void main()
24 {
25         double x[NODES], y[NODES], z[NODES];
26         double vx, vy, vz;
27         double xg[NODES], yg[NODES], zg[NODES];
28         double mx, my, halfangle;
29         double cx,cy,cz,sx,sy,sz;
30         double t1,t2,t3;
31         int node;
32 
33         vx=0; vy=0; vz=0;
34 
35         x[0]=-SIZE; y[0]=-SIZE; z[0]=-SIZE;
36         x[1]=-SIZE; y[1]= SIZE; z[1]=-SIZE;
37         x[2]= SIZE; y[2]= SIZE; z[2]=-SIZE;
38         x[3]= SIZE; y[3]=-SIZE; z[3]=-SIZE;
39         x[4]=-SIZE; y[4]=-SIZE; z[4]= SIZE;
40         x[5]=-SIZE; y[5]= SIZE; z[5]= SIZE;
41         x[6]= SIZE; y[6]= SIZE; z[6]= SIZE;
42         x[7]= SIZE; y[7]=-SIZE; z[7]= SIZE;
43 
44         for(node=0;node!=NODES;node++) {
45                 xg[node]=x[node];
46                 yg[node]=y[node];
47                 zg[node]=z[node];
48         }
49         while(getk()==0) {
50                 cx=cos(vx); cy=cos(vy); sx=sin(vx); sy=sin(vy);
51                 cz=cos(vz); sz=sin(vz);
52                 mx=(MAX_X2-SIZE*1.8)*cos(vx)+MAX_X2;
53                 my=(MAX_Y2-SIZE*1.8)*sin(vy)+MAX_Y2;
54                 for(node=0;node!=NODES;node++) {
55 
56                         t1=yg[node]*cx-zg[node]*sx;
57                         t2=yg[node]*sx+zg[node]*cx;
58                         t3=xg[node]*cy;
59                         x[node] = (t3 + t2*sy)*cz;
60                         x[node] = x[node] - t1*sz;
61 
62                         y[node] = (t3 + t2*sy)*sz;
63                         y[node] = y[node] + t1*cz;
64 
65                         z[node]=-xg[node]*sy+t2*cy;
66                 }
67                 vx+=0.003; vy+=0.005; vz+=0.002;
68                 clg();
69                 draw(x[0]+mx,y[0]+my,x[1]+mx,y[1]+my);
70                 draw(x[1]+mx,y[1]+my,x[2]+mx,y[2]+my);
71                 draw(x[2]+mx,y[2]+my,x[3]+mx,y[3]+my);
72                 draw(x[3]+mx,y[3]+my,x[0]+mx,y[0]+my);
73                 draw(x[4]+mx,y[4]+my,x[5]+mx,y[5]+my);
74                 draw(x[5]+mx,y[5]+my,x[6]+mx,y[6]+my);
75                 draw(x[6]+mx,y[6]+my,x[7]+mx,y[7]+my);
76                 draw(x[7]+mx,y[7]+my,x[4]+mx,y[4]+my);
77                 draw(x[0]+mx,y[0]+my,x[4]+mx,y[4]+my);
78                 draw(x[3]+mx,y[3]+my,x[7]+mx,y[7]+my);
79                 draw(x[2]+mx,y[2]+my,x[6]+mx,y[6]+my);
80                 draw(x[1]+mx,y[1]+my,x[5]+mx,y[5]+my);
81         }
82 }
83