Blob


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