Replaced deprecated variables CONTRIBDIR, BINDIR and
[AROS-Contrib.git] / fish / 362_rubik / trig.c
blob088b66dd85d58afbc483d01eddf8590231aa7da2
1 /* trig.c fast integer trig functions etc. for rubik.c
2 martin round xmas eve 1989
3 */
5 #include <math.h>
7 short sintab [360];
9 void init_trig()
11 double degtorad;
12 int i;
14 degtorad = 3.14159/180.0;
15 for (i=1; i<90; i++)
17 sintab[i] = sintab[180-i] = (short) (0.5 + 256.0 * sin(degtorad * i));
18 sintab[i+180] = sintab[360-i] = -sintab[i];
20 sintab[0] = 0;
21 sintab[90] = 256;
22 sintab[180] = 0;
23 sintab[270] = -256;
27 short mysin(int ang) /* works with degrees! return is 256*sin(ang) */
30 if (ang < 0)
31 return (sintab [ang + 360]);
33 if (ang >359)
34 return (sintab [ang - 360]);
36 return (sintab[ang]);
39 short mycos(int ang)
41 if (ang < -90)
42 return (sintab [ang + 450]);
44 if (ang >269)
45 return (sintab [ang - 270]);
47 return (sintab [ang + 90]);
50 unsigned short hypoten ( short x, short y)
52 register unsigned long square = x * x + y * y;
53 register unsigned short root = x<0 ? -x : x;
54 register unsigned short correction;
56 root += y<0 ? -y+1 : y+1;
60 root -= (correction = (root * root - square) / (root * 2));
61 } while (correction);
63 return (--root);
66 short angle(short x, short y, unsigned short r) /* find vector */
68 register short ang,s,e,sine;
69 short flag;
71 if ((r * x * y) == 0)
73 if (r == 0)
74 return (0);
75 if (x == 0)
77 if (y >=0)
78 return (90);
79 else
80 return (-90);
82 if (x >=0)
83 return (0);
84 else
85 return (180);
88 ang = y<0 ? -y : y;
90 s = x<0 ? -x : x;
92 if ((flag = (s < ang)))
93 ang = s;
95 sine = (ang << 8) / r;
97 ang = 21;
98 s = 92; /* sintab [21] */
99 e = sine - s;
101 while ((e < -2) || (e > 2))
103 if (e > 4)
104 ang += ((46-ang)*e)/(184-s);
105 else if (e < -4)
106 ang -= ((1-ang)*e)/(s-4);
107 else if (e < 0)
109 --ang;
110 break;
112 else
114 ++ang;
115 break;
118 e = sine-(s = sintab[ang]);
121 if (flag)
122 ang = 90 - ang;
124 if (x < 0)
125 ang = 180 - ang;
127 if (y < 0)
128 ang = -ang;
130 return (ang);
133 void rotate (short *a, short *b, short ang)
135 static short olda,oldb,oldang,olda1,oldb1;
136 unsigned short r;
138 if ((*a == olda) && (*b == oldb) && (ang == oldang))
140 *a = olda1;
141 *b = oldb1;
143 else
145 olda = *a;
146 oldb = *b;
147 oldang = ang;
149 ang += angle (*a, *b, (r = hypoten (*a, *b)));
151 *a = olda1 = (r * mycos(ang)) >> 8;
152 *b = oldb1 = (r * mysin(ang)) >> 8;