Blame


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