home *** CD-ROM | disk | FTP | other *** search
- /* rotate.c for rubik.c M.J.R. Boxing Day 1989 */
-
- extern struct points point;
- extern struct one_square square[56];
- extern int twistlist[21];
- int biglist [126] =
- {
- 0, 1, 2, 3, 4, 5, 6, 7, 8,18,19,20,27,28,29,36,39,42,45,48,51,
- 9,10,11,12,13,14,15,16,17,24,25,26,33,34,35,38,41,44,47,50,53,
- 0, 1, 2, 9,10,11,18,19,20,21,22,23,24,25,26,36,37,38,45,46,47,
- 6, 7, 8,15,16,17,27,28,29,30,31,32,33,34,35,42,43,44,51,52,53,
- 0, 3, 6, 9,12,15,18,21,24,27,30,33,36,37,38,39,40,41,42,43,44,
- 2, 5, 8,11,14,17,20,23,26,29,32,35,45,46,47,48,49,50,51,52,53
- };
-
- extern short mysin(int);
- extern short mycos(int);
- extern short hypot(short, short);
- extern short angle(short, short, short);
- extern unsigned short size;
- extern void rotate (short *a, short *b, short ang);
-
- void fb (short layer, short ang) /* twist front or back layer */
- {
- /* layer = 0 for front, 1 for back */
-
- int i,j,k,*p,*q;
-
- /* define extra 2 squares */
- if (layer)
- {
- i = 55;
- j = 54;
- }
- else
- {
- i = 54;
- j = 55;
- }
-
- (square[i]).corner[0] = &(point.xyz [0] [0] [k = layer + layer + 1]);
- (square[i]).corner[1] = &(point.xyz [5] [0] [k]);
- (square[i]).corner[2] = &(point.xyz [5] [5] [k]);
- (square[i]).corner[3] = &(point.xyz [0] [5] [k]);
- (square[j]).corner[0] = &(point.xyz [0] [0] [++k]);
- (square[j]).corner[1] = &(point.xyz [0] [5] [k]);
- (square[j]).corner[2] = &(point.xyz [5] [5] [k]);
- (square[j]).corner[3] = &(point.xyz [5] [0] [k]);
-
- for (k=4*layer; k < (4*layer+2); k++)
- for (i=0; i<6; i++)
- for (j=0; j<6; j++)
- if (i==0 || i==5 || j==0 || j==5 || k==0 || k==5)
- rotate
- (
- &((point.xyz [i] [j] [k]).x),
- &((point.xyz [i] [j] [k]).y),
- ang
- );
-
- p = &(twistlist[0]);
- q = &(biglist[layer * 21]);
-
- for (i=0; i<21; i++)
- *p++ = *q++;
- }
-
- void bt (short layer, short ang) /* twist bottom or top layer */
- {
- /* layer = 0 for bottom, 1 for top */
-
- int i,j,k,*p,*q;
-
- /* define extra 2 squares */
- if (layer)
- {
- i = 55;
- j = 54;
- }
- else
- {
- i = 54;
- j = 55;
- }
-
- (square[i]).corner[0] = &(point.xyz [0] [k = layer + layer + 1] [0]);
- (square[i]).corner[1] = &(point.xyz [0] [k] [5]);
- (square[i]).corner[2] = &(point.xyz [5] [k] [5]);
- (square[i]).corner[3] = &(point.xyz [5] [k] [0]);
- (square[j]).corner[0] = &(point.xyz [0] [++k] [0]);
- (square[j]).corner[1] = &(point.xyz [5] [k] [0]);
- (square[j]).corner[2] = &(point.xyz [5] [k] [5]);
- (square[j]).corner[3] = &(point.xyz [0] [k] [5]);
-
- for (k=4*layer; k < (4*layer+2); k++)
- for (i=0; i<6; i++)
- for (j=0; j<6; j++)
- if (i==0 || i==5 || j==0 || j==5 || k==0 || k==5)
- rotate
- (
- &((point.xyz [i] [k] [j]).x),
- &((point.xyz [i] [k] [j]).z),
- ang
- );
-
- p = &(twistlist[0]);
- q = &(biglist[42 + layer * 21]);
-
- for (i=0; i<21; i++)
- *p++ = *q++;
- }
-
- void lr (short layer, short ang) /* twist left or right layer */
- {
- /* layer = 0 for left, 1 for right */
-
- int i,j,k,*p,*q;
-
- /* define extra 2 squares */
- if (layer)
- {
- i = 55;
- j = 54;
- }
- else
- {
- i = 54;
- j = 55;
- }
-
- (square[i]).corner[0] = &(point.xyz [k = layer + layer + 1] [0] [0]);
- (square[i]).corner[1] = &(point.xyz [k] [5] [0]);
- (square[i]).corner[2] = &(point.xyz [k] [5] [5]);
- (square[i]).corner[3] = &(point.xyz [k] [0] [5]);
- (square[j]).corner[0] = &(point.xyz [++k] [0] [0]);
- (square[j]).corner[1] = &(point.xyz [k] [0] [5]);
- (square[j]).corner[2] = &(point.xyz [k] [5] [5]);
- (square[j]).corner[3] = &(point.xyz [k] [5] [0]);
-
- for (k=4*layer; k < (4*layer+2); k++)
- for (i=0; i<6; i++)
- for (j=0; j<6; j++)
- if (i==0 || i==5 || j==0 || j==5 || k==0 || k==5)
- rotate
- (
- &((point.xyz [k] [j] [i]).z),
- &((point.xyz [k] [j] [i]).y),
- ang
- );
-
-
- p = &(twistlist[0]);
- q = &(biglist[84 + layer * 21]);
-
- for (i=0; i<21; i++)
- *p++ = *q++;
- }
-
- void roll (short ang) /* roll whole cube through (ang) */
- {
- int i,j,k;
-
- for (i=0; i<6; i++)
- for (j=0; j<6; j++)
- for (k=0; k<6; k++)
- if (i==0 || i==5 || j==0 || j==5 || k==0 || k==5)
- rotate
- (
- &((point.xyz [i] [j] [k]).x),
- &((point.xyz [i] [j] [k]).y),
- ang
- );
- }
-
- void yaw (short ang) /* yaw whole cube through (ang) */
- {
- int i,j,k;
-
- for (i=0; i<6; i++)
- for (j=0; j<6; j++)
- for (k=0; k<6; k++)
- if (i==0 || i==5 || j==0 || j==5 || k==0 || k==5)
- rotate
- (
- &((point.xyz [i] [j] [k]).x),
- &((point.xyz [i] [j] [k]).z),
- ang
- );
- }
-
- void pitch (short ang) /* pitch whole cube through (ang) */
- {
- int i,j,k;
-
- for (i=0; i<6; i++)
- for (j=0; j<6; j++)
- for (k=0; k<6; k++)
- if (i==0 || i==5 || j==0 || j==5 || k==0 || k==5)
- rotate
- (
- &((point.xyz [i] [j] [k]).y),
- &((point.xyz [i] [j] [k]).z),
- ang
- );
- }
-