1*37da2899SCharles.Forsyth #include "lib9.h"
2*37da2899SCharles.Forsyth #include "draw.h"
3*37da2899SCharles.Forsyth
4*37da2899SCharles.Forsyth /*
5*37da2899SCharles.Forsyth * Sine and Cosine of arctangents, calculated by
6*37da2899SCharles.Forsyth * (sin(atan(index/100.0))*1024.+0.5)
7*37da2899SCharles.Forsyth * (cos(atan(index/100.0))*1024.+0.5)
8*37da2899SCharles.Forsyth * To use, get rational tangent between 0<=tan<=1, scale by 100,
9*37da2899SCharles.Forsyth * and look up sin and cos, and use linear interpolation. divide by 1024.
10*37da2899SCharles.Forsyth * Maximum error is 0.0020. Without linear interpolation, it's 0.010.
11*37da2899SCharles.Forsyth */
12*37da2899SCharles.Forsyth static
13*37da2899SCharles.Forsyth short sinus[] = {
14*37da2899SCharles.Forsyth 0, /* 0.00 */
15*37da2899SCharles.Forsyth 10, /* 0.01 */
16*37da2899SCharles.Forsyth 20, /* 0.02 */
17*37da2899SCharles.Forsyth 31, /* 0.03 */
18*37da2899SCharles.Forsyth 41, /* 0.04 */
19*37da2899SCharles.Forsyth 51, /* 0.05 */
20*37da2899SCharles.Forsyth 61, /* 0.06 */
21*37da2899SCharles.Forsyth 72, /* 0.07 */
22*37da2899SCharles.Forsyth 82, /* 0.08 */
23*37da2899SCharles.Forsyth 92, /* 0.09 */
24*37da2899SCharles.Forsyth 102, /* 0.10 */
25*37da2899SCharles.Forsyth 112, /* 0.11 */
26*37da2899SCharles.Forsyth 122, /* 0.12 */
27*37da2899SCharles.Forsyth 132, /* 0.13 */
28*37da2899SCharles.Forsyth 142, /* 0.14 */
29*37da2899SCharles.Forsyth 152, /* 0.15 */
30*37da2899SCharles.Forsyth 162, /* 0.16 */
31*37da2899SCharles.Forsyth 172, /* 0.17 */
32*37da2899SCharles.Forsyth 181, /* 0.18 */
33*37da2899SCharles.Forsyth 191, /* 0.19 */
34*37da2899SCharles.Forsyth 201, /* 0.20 */
35*37da2899SCharles.Forsyth 210, /* 0.21 */
36*37da2899SCharles.Forsyth 220, /* 0.22 */
37*37da2899SCharles.Forsyth 230, /* 0.23 */
38*37da2899SCharles.Forsyth 239, /* 0.24 */
39*37da2899SCharles.Forsyth 248, /* 0.25 */
40*37da2899SCharles.Forsyth 258, /* 0.26 */
41*37da2899SCharles.Forsyth 267, /* 0.27 */
42*37da2899SCharles.Forsyth 276, /* 0.28 */
43*37da2899SCharles.Forsyth 285, /* 0.29 */
44*37da2899SCharles.Forsyth 294, /* 0.30 */
45*37da2899SCharles.Forsyth 303, /* 0.31 */
46*37da2899SCharles.Forsyth 312, /* 0.32 */
47*37da2899SCharles.Forsyth 321, /* 0.33 */
48*37da2899SCharles.Forsyth 330, /* 0.34 */
49*37da2899SCharles.Forsyth 338, /* 0.35 */
50*37da2899SCharles.Forsyth 347, /* 0.36 */
51*37da2899SCharles.Forsyth 355, /* 0.37 */
52*37da2899SCharles.Forsyth 364, /* 0.38 */
53*37da2899SCharles.Forsyth 372, /* 0.39 */
54*37da2899SCharles.Forsyth 380, /* 0.40 */
55*37da2899SCharles.Forsyth 388, /* 0.41 */
56*37da2899SCharles.Forsyth 397, /* 0.42 */
57*37da2899SCharles.Forsyth 405, /* 0.43 */
58*37da2899SCharles.Forsyth 412, /* 0.44 */
59*37da2899SCharles.Forsyth 420, /* 0.45 */
60*37da2899SCharles.Forsyth 428, /* 0.46 */
61*37da2899SCharles.Forsyth 436, /* 0.47 */
62*37da2899SCharles.Forsyth 443, /* 0.48 */
63*37da2899SCharles.Forsyth 451, /* 0.49 */
64*37da2899SCharles.Forsyth 458, /* 0.50 */
65*37da2899SCharles.Forsyth 465, /* 0.51 */
66*37da2899SCharles.Forsyth 472, /* 0.52 */
67*37da2899SCharles.Forsyth 480, /* 0.53 */
68*37da2899SCharles.Forsyth 487, /* 0.54 */
69*37da2899SCharles.Forsyth 493, /* 0.55 */
70*37da2899SCharles.Forsyth 500, /* 0.56 */
71*37da2899SCharles.Forsyth 507, /* 0.57 */
72*37da2899SCharles.Forsyth 514, /* 0.58 */
73*37da2899SCharles.Forsyth 520, /* 0.59 */
74*37da2899SCharles.Forsyth 527, /* 0.60 */
75*37da2899SCharles.Forsyth 533, /* 0.61 */
76*37da2899SCharles.Forsyth 540, /* 0.62 */
77*37da2899SCharles.Forsyth 546, /* 0.63 */
78*37da2899SCharles.Forsyth 552, /* 0.64 */
79*37da2899SCharles.Forsyth 558, /* 0.65 */
80*37da2899SCharles.Forsyth 564, /* 0.66 */
81*37da2899SCharles.Forsyth 570, /* 0.67 */
82*37da2899SCharles.Forsyth 576, /* 0.68 */
83*37da2899SCharles.Forsyth 582, /* 0.69 */
84*37da2899SCharles.Forsyth 587, /* 0.70 */
85*37da2899SCharles.Forsyth 593, /* 0.71 */
86*37da2899SCharles.Forsyth 598, /* 0.72 */
87*37da2899SCharles.Forsyth 604, /* 0.73 */
88*37da2899SCharles.Forsyth 609, /* 0.74 */
89*37da2899SCharles.Forsyth 614, /* 0.75 */
90*37da2899SCharles.Forsyth 620, /* 0.76 */
91*37da2899SCharles.Forsyth 625, /* 0.77 */
92*37da2899SCharles.Forsyth 630, /* 0.78 */
93*37da2899SCharles.Forsyth 635, /* 0.79 */
94*37da2899SCharles.Forsyth 640, /* 0.80 */
95*37da2899SCharles.Forsyth 645, /* 0.81 */
96*37da2899SCharles.Forsyth 649, /* 0.82 */
97*37da2899SCharles.Forsyth 654, /* 0.83 */
98*37da2899SCharles.Forsyth 659, /* 0.84 */
99*37da2899SCharles.Forsyth 663, /* 0.85 */
100*37da2899SCharles.Forsyth 668, /* 0.86 */
101*37da2899SCharles.Forsyth 672, /* 0.87 */
102*37da2899SCharles.Forsyth 676, /* 0.88 */
103*37da2899SCharles.Forsyth 681, /* 0.89 */
104*37da2899SCharles.Forsyth 685, /* 0.90 */
105*37da2899SCharles.Forsyth 689, /* 0.91 */
106*37da2899SCharles.Forsyth 693, /* 0.92 */
107*37da2899SCharles.Forsyth 697, /* 0.93 */
108*37da2899SCharles.Forsyth 701, /* 0.94 */
109*37da2899SCharles.Forsyth 705, /* 0.95 */
110*37da2899SCharles.Forsyth 709, /* 0.96 */
111*37da2899SCharles.Forsyth 713, /* 0.97 */
112*37da2899SCharles.Forsyth 717, /* 0.98 */
113*37da2899SCharles.Forsyth 720, /* 0.99 */
114*37da2899SCharles.Forsyth 724, /* 1.00 */
115*37da2899SCharles.Forsyth 728, /* 1.01 */
116*37da2899SCharles.Forsyth };
117*37da2899SCharles.Forsyth
118*37da2899SCharles.Forsyth static
119*37da2899SCharles.Forsyth short cosinus[] = {
120*37da2899SCharles.Forsyth 1024, /* 0.00 */
121*37da2899SCharles.Forsyth 1024, /* 0.01 */
122*37da2899SCharles.Forsyth 1024, /* 0.02 */
123*37da2899SCharles.Forsyth 1024, /* 0.03 */
124*37da2899SCharles.Forsyth 1023, /* 0.04 */
125*37da2899SCharles.Forsyth 1023, /* 0.05 */
126*37da2899SCharles.Forsyth 1022, /* 0.06 */
127*37da2899SCharles.Forsyth 1022, /* 0.07 */
128*37da2899SCharles.Forsyth 1021, /* 0.08 */
129*37da2899SCharles.Forsyth 1020, /* 0.09 */
130*37da2899SCharles.Forsyth 1019, /* 0.10 */
131*37da2899SCharles.Forsyth 1018, /* 0.11 */
132*37da2899SCharles.Forsyth 1017, /* 0.12 */
133*37da2899SCharles.Forsyth 1015, /* 0.13 */
134*37da2899SCharles.Forsyth 1014, /* 0.14 */
135*37da2899SCharles.Forsyth 1013, /* 0.15 */
136*37da2899SCharles.Forsyth 1011, /* 0.16 */
137*37da2899SCharles.Forsyth 1010, /* 0.17 */
138*37da2899SCharles.Forsyth 1008, /* 0.18 */
139*37da2899SCharles.Forsyth 1006, /* 0.19 */
140*37da2899SCharles.Forsyth 1004, /* 0.20 */
141*37da2899SCharles.Forsyth 1002, /* 0.21 */
142*37da2899SCharles.Forsyth 1000, /* 0.22 */
143*37da2899SCharles.Forsyth 998, /* 0.23 */
144*37da2899SCharles.Forsyth 996, /* 0.24 */
145*37da2899SCharles.Forsyth 993, /* 0.25 */
146*37da2899SCharles.Forsyth 991, /* 0.26 */
147*37da2899SCharles.Forsyth 989, /* 0.27 */
148*37da2899SCharles.Forsyth 986, /* 0.28 */
149*37da2899SCharles.Forsyth 983, /* 0.29 */
150*37da2899SCharles.Forsyth 981, /* 0.30 */
151*37da2899SCharles.Forsyth 978, /* 0.31 */
152*37da2899SCharles.Forsyth 975, /* 0.32 */
153*37da2899SCharles.Forsyth 972, /* 0.33 */
154*37da2899SCharles.Forsyth 969, /* 0.34 */
155*37da2899SCharles.Forsyth 967, /* 0.35 */
156*37da2899SCharles.Forsyth 963, /* 0.36 */
157*37da2899SCharles.Forsyth 960, /* 0.37 */
158*37da2899SCharles.Forsyth 957, /* 0.38 */
159*37da2899SCharles.Forsyth 954, /* 0.39 */
160*37da2899SCharles.Forsyth 951, /* 0.40 */
161*37da2899SCharles.Forsyth 947, /* 0.41 */
162*37da2899SCharles.Forsyth 944, /* 0.42 */
163*37da2899SCharles.Forsyth 941, /* 0.43 */
164*37da2899SCharles.Forsyth 937, /* 0.44 */
165*37da2899SCharles.Forsyth 934, /* 0.45 */
166*37da2899SCharles.Forsyth 930, /* 0.46 */
167*37da2899SCharles.Forsyth 927, /* 0.47 */
168*37da2899SCharles.Forsyth 923, /* 0.48 */
169*37da2899SCharles.Forsyth 920, /* 0.49 */
170*37da2899SCharles.Forsyth 916, /* 0.50 */
171*37da2899SCharles.Forsyth 912, /* 0.51 */
172*37da2899SCharles.Forsyth 909, /* 0.52 */
173*37da2899SCharles.Forsyth 905, /* 0.53 */
174*37da2899SCharles.Forsyth 901, /* 0.54 */
175*37da2899SCharles.Forsyth 897, /* 0.55 */
176*37da2899SCharles.Forsyth 893, /* 0.56 */
177*37da2899SCharles.Forsyth 890, /* 0.57 */
178*37da2899SCharles.Forsyth 886, /* 0.58 */
179*37da2899SCharles.Forsyth 882, /* 0.59 */
180*37da2899SCharles.Forsyth 878, /* 0.60 */
181*37da2899SCharles.Forsyth 874, /* 0.61 */
182*37da2899SCharles.Forsyth 870, /* 0.62 */
183*37da2899SCharles.Forsyth 866, /* 0.63 */
184*37da2899SCharles.Forsyth 862, /* 0.64 */
185*37da2899SCharles.Forsyth 859, /* 0.65 */
186*37da2899SCharles.Forsyth 855, /* 0.66 */
187*37da2899SCharles.Forsyth 851, /* 0.67 */
188*37da2899SCharles.Forsyth 847, /* 0.68 */
189*37da2899SCharles.Forsyth 843, /* 0.69 */
190*37da2899SCharles.Forsyth 839, /* 0.70 */
191*37da2899SCharles.Forsyth 835, /* 0.71 */
192*37da2899SCharles.Forsyth 831, /* 0.72 */
193*37da2899SCharles.Forsyth 827, /* 0.73 */
194*37da2899SCharles.Forsyth 823, /* 0.74 */
195*37da2899SCharles.Forsyth 819, /* 0.75 */
196*37da2899SCharles.Forsyth 815, /* 0.76 */
197*37da2899SCharles.Forsyth 811, /* 0.77 */
198*37da2899SCharles.Forsyth 807, /* 0.78 */
199*37da2899SCharles.Forsyth 804, /* 0.79 */
200*37da2899SCharles.Forsyth 800, /* 0.80 */
201*37da2899SCharles.Forsyth 796, /* 0.81 */
202*37da2899SCharles.Forsyth 792, /* 0.82 */
203*37da2899SCharles.Forsyth 788, /* 0.83 */
204*37da2899SCharles.Forsyth 784, /* 0.84 */
205*37da2899SCharles.Forsyth 780, /* 0.85 */
206*37da2899SCharles.Forsyth 776, /* 0.86 */
207*37da2899SCharles.Forsyth 773, /* 0.87 */
208*37da2899SCharles.Forsyth 769, /* 0.88 */
209*37da2899SCharles.Forsyth 765, /* 0.89 */
210*37da2899SCharles.Forsyth 761, /* 0.90 */
211*37da2899SCharles.Forsyth 757, /* 0.91 */
212*37da2899SCharles.Forsyth 754, /* 0.92 */
213*37da2899SCharles.Forsyth 750, /* 0.93 */
214*37da2899SCharles.Forsyth 746, /* 0.94 */
215*37da2899SCharles.Forsyth 742, /* 0.95 */
216*37da2899SCharles.Forsyth 739, /* 0.96 */
217*37da2899SCharles.Forsyth 735, /* 0.97 */
218*37da2899SCharles.Forsyth 731, /* 0.98 */
219*37da2899SCharles.Forsyth 728, /* 0.99 */
220*37da2899SCharles.Forsyth 724, /* 1.00 */
221*37da2899SCharles.Forsyth 720, /* 1.01 */
222*37da2899SCharles.Forsyth };
223*37da2899SCharles.Forsyth
224*37da2899SCharles.Forsyth void
icossin2(int x,int y,int * cosp,int * sinp)225*37da2899SCharles.Forsyth icossin2(int x, int y, int *cosp, int *sinp)
226*37da2899SCharles.Forsyth {
227*37da2899SCharles.Forsyth int sinsign, cossign, tan, tan10, rem;
228*37da2899SCharles.Forsyth short *stp, *ctp;
229*37da2899SCharles.Forsyth
230*37da2899SCharles.Forsyth if(x == 0){
231*37da2899SCharles.Forsyth if(y >= 0)
232*37da2899SCharles.Forsyth *sinp = ICOSSCALE, *cosp = 0;
233*37da2899SCharles.Forsyth else
234*37da2899SCharles.Forsyth *sinp = -ICOSSCALE, *cosp = 0;
235*37da2899SCharles.Forsyth return;
236*37da2899SCharles.Forsyth }
237*37da2899SCharles.Forsyth sinsign = cossign = 1;
238*37da2899SCharles.Forsyth if(x < 0){
239*37da2899SCharles.Forsyth cossign = -1;
240*37da2899SCharles.Forsyth x = -x;
241*37da2899SCharles.Forsyth }
242*37da2899SCharles.Forsyth if(y < 0){
243*37da2899SCharles.Forsyth sinsign = -1;
244*37da2899SCharles.Forsyth y = -y;
245*37da2899SCharles.Forsyth }
246*37da2899SCharles.Forsyth if(y > x){
247*37da2899SCharles.Forsyth tan = 1000*x/y;
248*37da2899SCharles.Forsyth tan10 = tan/10;
249*37da2899SCharles.Forsyth stp = &cosinus[tan10];
250*37da2899SCharles.Forsyth ctp = &sinus[tan10];
251*37da2899SCharles.Forsyth }else{
252*37da2899SCharles.Forsyth tan = 1000*y/x;
253*37da2899SCharles.Forsyth tan10 = tan/10;
254*37da2899SCharles.Forsyth stp = &sinus[tan10];
255*37da2899SCharles.Forsyth ctp = &cosinus[tan10];
256*37da2899SCharles.Forsyth }
257*37da2899SCharles.Forsyth rem = tan-(tan10*10);
258*37da2899SCharles.Forsyth *sinp = sinsign*(stp[0]+(stp[1]-stp[0])*rem/10);
259*37da2899SCharles.Forsyth *cosp = cossign*(ctp[0]+(ctp[1]-ctp[0])*rem/10);
260*37da2899SCharles.Forsyth }
261