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