1*8ccd4a63SDavid du Colombier #include <u.h>
2*8ccd4a63SDavid du Colombier #include <libc.h>
3*8ccd4a63SDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier
57dd7cddfSDavid du Colombier /*
67dd7cddfSDavid du Colombier * Sine and Cosine of arctangents, calculated by
77dd7cddfSDavid du Colombier * (sin(atan(index/100.0))*1024.+0.5)
87dd7cddfSDavid du Colombier * (cos(atan(index/100.0))*1024.+0.5)
97dd7cddfSDavid du Colombier * To use, get rational tangent between 0<=tan<=1, scale by 100,
107dd7cddfSDavid du Colombier * and look up sin and cos, and use linear interpolation. divide by 1024.
117dd7cddfSDavid du Colombier * Maximum error is 0.0020. Without linear interpolation, it's 0.010.
127dd7cddfSDavid du Colombier */
137dd7cddfSDavid du Colombier static
147dd7cddfSDavid du Colombier short sinus[] = {
157dd7cddfSDavid du Colombier 0, /* 0.00 */
167dd7cddfSDavid du Colombier 10, /* 0.01 */
177dd7cddfSDavid du Colombier 20, /* 0.02 */
187dd7cddfSDavid du Colombier 31, /* 0.03 */
197dd7cddfSDavid du Colombier 41, /* 0.04 */
207dd7cddfSDavid du Colombier 51, /* 0.05 */
217dd7cddfSDavid du Colombier 61, /* 0.06 */
227dd7cddfSDavid du Colombier 72, /* 0.07 */
237dd7cddfSDavid du Colombier 82, /* 0.08 */
247dd7cddfSDavid du Colombier 92, /* 0.09 */
257dd7cddfSDavid du Colombier 102, /* 0.10 */
267dd7cddfSDavid du Colombier 112, /* 0.11 */
277dd7cddfSDavid du Colombier 122, /* 0.12 */
287dd7cddfSDavid du Colombier 132, /* 0.13 */
297dd7cddfSDavid du Colombier 142, /* 0.14 */
307dd7cddfSDavid du Colombier 152, /* 0.15 */
317dd7cddfSDavid du Colombier 162, /* 0.16 */
327dd7cddfSDavid du Colombier 172, /* 0.17 */
337dd7cddfSDavid du Colombier 181, /* 0.18 */
347dd7cddfSDavid du Colombier 191, /* 0.19 */
357dd7cddfSDavid du Colombier 201, /* 0.20 */
367dd7cddfSDavid du Colombier 210, /* 0.21 */
377dd7cddfSDavid du Colombier 220, /* 0.22 */
387dd7cddfSDavid du Colombier 230, /* 0.23 */
397dd7cddfSDavid du Colombier 239, /* 0.24 */
407dd7cddfSDavid du Colombier 248, /* 0.25 */
417dd7cddfSDavid du Colombier 258, /* 0.26 */
427dd7cddfSDavid du Colombier 267, /* 0.27 */
437dd7cddfSDavid du Colombier 276, /* 0.28 */
447dd7cddfSDavid du Colombier 285, /* 0.29 */
457dd7cddfSDavid du Colombier 294, /* 0.30 */
467dd7cddfSDavid du Colombier 303, /* 0.31 */
477dd7cddfSDavid du Colombier 312, /* 0.32 */
487dd7cddfSDavid du Colombier 321, /* 0.33 */
497dd7cddfSDavid du Colombier 330, /* 0.34 */
507dd7cddfSDavid du Colombier 338, /* 0.35 */
517dd7cddfSDavid du Colombier 347, /* 0.36 */
527dd7cddfSDavid du Colombier 355, /* 0.37 */
537dd7cddfSDavid du Colombier 364, /* 0.38 */
547dd7cddfSDavid du Colombier 372, /* 0.39 */
557dd7cddfSDavid du Colombier 380, /* 0.40 */
567dd7cddfSDavid du Colombier 388, /* 0.41 */
577dd7cddfSDavid du Colombier 397, /* 0.42 */
587dd7cddfSDavid du Colombier 405, /* 0.43 */
597dd7cddfSDavid du Colombier 412, /* 0.44 */
607dd7cddfSDavid du Colombier 420, /* 0.45 */
617dd7cddfSDavid du Colombier 428, /* 0.46 */
627dd7cddfSDavid du Colombier 436, /* 0.47 */
637dd7cddfSDavid du Colombier 443, /* 0.48 */
647dd7cddfSDavid du Colombier 451, /* 0.49 */
657dd7cddfSDavid du Colombier 458, /* 0.50 */
667dd7cddfSDavid du Colombier 465, /* 0.51 */
677dd7cddfSDavid du Colombier 472, /* 0.52 */
687dd7cddfSDavid du Colombier 480, /* 0.53 */
697dd7cddfSDavid du Colombier 487, /* 0.54 */
707dd7cddfSDavid du Colombier 493, /* 0.55 */
717dd7cddfSDavid du Colombier 500, /* 0.56 */
727dd7cddfSDavid du Colombier 507, /* 0.57 */
737dd7cddfSDavid du Colombier 514, /* 0.58 */
747dd7cddfSDavid du Colombier 520, /* 0.59 */
757dd7cddfSDavid du Colombier 527, /* 0.60 */
767dd7cddfSDavid du Colombier 533, /* 0.61 */
777dd7cddfSDavid du Colombier 540, /* 0.62 */
787dd7cddfSDavid du Colombier 546, /* 0.63 */
797dd7cddfSDavid du Colombier 552, /* 0.64 */
807dd7cddfSDavid du Colombier 558, /* 0.65 */
817dd7cddfSDavid du Colombier 564, /* 0.66 */
827dd7cddfSDavid du Colombier 570, /* 0.67 */
837dd7cddfSDavid du Colombier 576, /* 0.68 */
847dd7cddfSDavid du Colombier 582, /* 0.69 */
857dd7cddfSDavid du Colombier 587, /* 0.70 */
867dd7cddfSDavid du Colombier 593, /* 0.71 */
877dd7cddfSDavid du Colombier 598, /* 0.72 */
887dd7cddfSDavid du Colombier 604, /* 0.73 */
897dd7cddfSDavid du Colombier 609, /* 0.74 */
907dd7cddfSDavid du Colombier 614, /* 0.75 */
917dd7cddfSDavid du Colombier 620, /* 0.76 */
927dd7cddfSDavid du Colombier 625, /* 0.77 */
937dd7cddfSDavid du Colombier 630, /* 0.78 */
947dd7cddfSDavid du Colombier 635, /* 0.79 */
957dd7cddfSDavid du Colombier 640, /* 0.80 */
967dd7cddfSDavid du Colombier 645, /* 0.81 */
977dd7cddfSDavid du Colombier 649, /* 0.82 */
987dd7cddfSDavid du Colombier 654, /* 0.83 */
997dd7cddfSDavid du Colombier 659, /* 0.84 */
1007dd7cddfSDavid du Colombier 663, /* 0.85 */
1017dd7cddfSDavid du Colombier 668, /* 0.86 */
1027dd7cddfSDavid du Colombier 672, /* 0.87 */
1037dd7cddfSDavid du Colombier 676, /* 0.88 */
1047dd7cddfSDavid du Colombier 681, /* 0.89 */
1057dd7cddfSDavid du Colombier 685, /* 0.90 */
1067dd7cddfSDavid du Colombier 689, /* 0.91 */
1077dd7cddfSDavid du Colombier 693, /* 0.92 */
1087dd7cddfSDavid du Colombier 697, /* 0.93 */
1097dd7cddfSDavid du Colombier 701, /* 0.94 */
1107dd7cddfSDavid du Colombier 705, /* 0.95 */
1117dd7cddfSDavid du Colombier 709, /* 0.96 */
1127dd7cddfSDavid du Colombier 713, /* 0.97 */
1137dd7cddfSDavid du Colombier 717, /* 0.98 */
1147dd7cddfSDavid du Colombier 720, /* 0.99 */
1157dd7cddfSDavid du Colombier 724, /* 1.00 */
1167dd7cddfSDavid du Colombier 728, /* 1.01 */
1177dd7cddfSDavid du Colombier };
1187dd7cddfSDavid du Colombier
1197dd7cddfSDavid du Colombier static
1207dd7cddfSDavid du Colombier short cosinus[] = {
1217dd7cddfSDavid du Colombier 1024, /* 0.00 */
1227dd7cddfSDavid du Colombier 1024, /* 0.01 */
1237dd7cddfSDavid du Colombier 1024, /* 0.02 */
1247dd7cddfSDavid du Colombier 1024, /* 0.03 */
1257dd7cddfSDavid du Colombier 1023, /* 0.04 */
1267dd7cddfSDavid du Colombier 1023, /* 0.05 */
1277dd7cddfSDavid du Colombier 1022, /* 0.06 */
1287dd7cddfSDavid du Colombier 1022, /* 0.07 */
1297dd7cddfSDavid du Colombier 1021, /* 0.08 */
1307dd7cddfSDavid du Colombier 1020, /* 0.09 */
1317dd7cddfSDavid du Colombier 1019, /* 0.10 */
1327dd7cddfSDavid du Colombier 1018, /* 0.11 */
1337dd7cddfSDavid du Colombier 1017, /* 0.12 */
1347dd7cddfSDavid du Colombier 1015, /* 0.13 */
1357dd7cddfSDavid du Colombier 1014, /* 0.14 */
1367dd7cddfSDavid du Colombier 1013, /* 0.15 */
1377dd7cddfSDavid du Colombier 1011, /* 0.16 */
1387dd7cddfSDavid du Colombier 1010, /* 0.17 */
1397dd7cddfSDavid du Colombier 1008, /* 0.18 */
1407dd7cddfSDavid du Colombier 1006, /* 0.19 */
1417dd7cddfSDavid du Colombier 1004, /* 0.20 */
1427dd7cddfSDavid du Colombier 1002, /* 0.21 */
1437dd7cddfSDavid du Colombier 1000, /* 0.22 */
1447dd7cddfSDavid du Colombier 998, /* 0.23 */
1457dd7cddfSDavid du Colombier 996, /* 0.24 */
1467dd7cddfSDavid du Colombier 993, /* 0.25 */
1477dd7cddfSDavid du Colombier 991, /* 0.26 */
1487dd7cddfSDavid du Colombier 989, /* 0.27 */
1497dd7cddfSDavid du Colombier 986, /* 0.28 */
1507dd7cddfSDavid du Colombier 983, /* 0.29 */
1517dd7cddfSDavid du Colombier 981, /* 0.30 */
1527dd7cddfSDavid du Colombier 978, /* 0.31 */
1537dd7cddfSDavid du Colombier 975, /* 0.32 */
1547dd7cddfSDavid du Colombier 972, /* 0.33 */
1557dd7cddfSDavid du Colombier 969, /* 0.34 */
1567dd7cddfSDavid du Colombier 967, /* 0.35 */
1577dd7cddfSDavid du Colombier 963, /* 0.36 */
1587dd7cddfSDavid du Colombier 960, /* 0.37 */
1597dd7cddfSDavid du Colombier 957, /* 0.38 */
1607dd7cddfSDavid du Colombier 954, /* 0.39 */
1617dd7cddfSDavid du Colombier 951, /* 0.40 */
1627dd7cddfSDavid du Colombier 947, /* 0.41 */
1637dd7cddfSDavid du Colombier 944, /* 0.42 */
1647dd7cddfSDavid du Colombier 941, /* 0.43 */
1657dd7cddfSDavid du Colombier 937, /* 0.44 */
1667dd7cddfSDavid du Colombier 934, /* 0.45 */
1677dd7cddfSDavid du Colombier 930, /* 0.46 */
1687dd7cddfSDavid du Colombier 927, /* 0.47 */
1697dd7cddfSDavid du Colombier 923, /* 0.48 */
1707dd7cddfSDavid du Colombier 920, /* 0.49 */
1717dd7cddfSDavid du Colombier 916, /* 0.50 */
1727dd7cddfSDavid du Colombier 912, /* 0.51 */
1737dd7cddfSDavid du Colombier 909, /* 0.52 */
1747dd7cddfSDavid du Colombier 905, /* 0.53 */
1757dd7cddfSDavid du Colombier 901, /* 0.54 */
1767dd7cddfSDavid du Colombier 897, /* 0.55 */
1777dd7cddfSDavid du Colombier 893, /* 0.56 */
1787dd7cddfSDavid du Colombier 890, /* 0.57 */
1797dd7cddfSDavid du Colombier 886, /* 0.58 */
1807dd7cddfSDavid du Colombier 882, /* 0.59 */
1817dd7cddfSDavid du Colombier 878, /* 0.60 */
1827dd7cddfSDavid du Colombier 874, /* 0.61 */
1837dd7cddfSDavid du Colombier 870, /* 0.62 */
1847dd7cddfSDavid du Colombier 866, /* 0.63 */
1857dd7cddfSDavid du Colombier 862, /* 0.64 */
1867dd7cddfSDavid du Colombier 859, /* 0.65 */
1877dd7cddfSDavid du Colombier 855, /* 0.66 */
1887dd7cddfSDavid du Colombier 851, /* 0.67 */
1897dd7cddfSDavid du Colombier 847, /* 0.68 */
1907dd7cddfSDavid du Colombier 843, /* 0.69 */
1917dd7cddfSDavid du Colombier 839, /* 0.70 */
1927dd7cddfSDavid du Colombier 835, /* 0.71 */
1937dd7cddfSDavid du Colombier 831, /* 0.72 */
1947dd7cddfSDavid du Colombier 827, /* 0.73 */
1957dd7cddfSDavid du Colombier 823, /* 0.74 */
1967dd7cddfSDavid du Colombier 819, /* 0.75 */
1977dd7cddfSDavid du Colombier 815, /* 0.76 */
1987dd7cddfSDavid du Colombier 811, /* 0.77 */
1997dd7cddfSDavid du Colombier 807, /* 0.78 */
2007dd7cddfSDavid du Colombier 804, /* 0.79 */
2017dd7cddfSDavid du Colombier 800, /* 0.80 */
2027dd7cddfSDavid du Colombier 796, /* 0.81 */
2037dd7cddfSDavid du Colombier 792, /* 0.82 */
2047dd7cddfSDavid du Colombier 788, /* 0.83 */
2057dd7cddfSDavid du Colombier 784, /* 0.84 */
2067dd7cddfSDavid du Colombier 780, /* 0.85 */
2077dd7cddfSDavid du Colombier 776, /* 0.86 */
2087dd7cddfSDavid du Colombier 773, /* 0.87 */
2097dd7cddfSDavid du Colombier 769, /* 0.88 */
2107dd7cddfSDavid du Colombier 765, /* 0.89 */
2117dd7cddfSDavid du Colombier 761, /* 0.90 */
2127dd7cddfSDavid du Colombier 757, /* 0.91 */
2137dd7cddfSDavid du Colombier 754, /* 0.92 */
2147dd7cddfSDavid du Colombier 750, /* 0.93 */
2157dd7cddfSDavid du Colombier 746, /* 0.94 */
2167dd7cddfSDavid du Colombier 742, /* 0.95 */
2177dd7cddfSDavid du Colombier 739, /* 0.96 */
2187dd7cddfSDavid du Colombier 735, /* 0.97 */
2197dd7cddfSDavid du Colombier 731, /* 0.98 */
2207dd7cddfSDavid du Colombier 728, /* 0.99 */
2217dd7cddfSDavid du Colombier 724, /* 1.00 */
2227dd7cddfSDavid du Colombier 720, /* 1.01 */
2237dd7cddfSDavid du Colombier };
2247dd7cddfSDavid du Colombier
2257dd7cddfSDavid du Colombier void
icossin2(int x,int y,int * cosp,int * sinp)2267dd7cddfSDavid du Colombier icossin2(int x, int y, int *cosp, int *sinp)
2277dd7cddfSDavid du Colombier {
2287dd7cddfSDavid du Colombier int sinsign, cossign, tan, tan10, rem;
2297dd7cddfSDavid du Colombier short *stp, *ctp;
2307dd7cddfSDavid du Colombier
2317dd7cddfSDavid du Colombier if(x == 0){
2327dd7cddfSDavid du Colombier if(y >= 0)
2337dd7cddfSDavid du Colombier *sinp = ICOSSCALE, *cosp = 0;
2347dd7cddfSDavid du Colombier else
2357dd7cddfSDavid du Colombier *sinp = -ICOSSCALE, *cosp = 0;
2367dd7cddfSDavid du Colombier return;
2377dd7cddfSDavid du Colombier }
2387dd7cddfSDavid du Colombier sinsign = cossign = 1;
2397dd7cddfSDavid du Colombier if(x < 0){
2407dd7cddfSDavid du Colombier cossign = -1;
2417dd7cddfSDavid du Colombier x = -x;
2427dd7cddfSDavid du Colombier }
2437dd7cddfSDavid du Colombier if(y < 0){
2447dd7cddfSDavid du Colombier sinsign = -1;
2457dd7cddfSDavid du Colombier y = -y;
2467dd7cddfSDavid du Colombier }
2477dd7cddfSDavid du Colombier if(y > x){
2487dd7cddfSDavid du Colombier tan = 1000*x/y;
2497dd7cddfSDavid du Colombier tan10 = tan/10;
2507dd7cddfSDavid du Colombier stp = &cosinus[tan10];
2517dd7cddfSDavid du Colombier ctp = &sinus[tan10];
2527dd7cddfSDavid du Colombier }else{
2537dd7cddfSDavid du Colombier tan = 1000*y/x;
2547dd7cddfSDavid du Colombier tan10 = tan/10;
2557dd7cddfSDavid du Colombier stp = &sinus[tan10];
2567dd7cddfSDavid du Colombier ctp = &cosinus[tan10];
2577dd7cddfSDavid du Colombier }
2587dd7cddfSDavid du Colombier rem = tan-(tan10*10);
2597dd7cddfSDavid du Colombier *sinp = sinsign*(stp[0]+(stp[1]-stp[0])*rem/10);
2607dd7cddfSDavid du Colombier *cosp = cossign*(ctp[0]+(ctp[1]-ctp[0])*rem/10);
2617dd7cddfSDavid du Colombier }
262