123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- #include <u.h>
- #include <libc.h>
- #include <draw.h>
- /*
- * Sine and Cosine of arctangents, calculated by
- * (sin(atan(index/100.0))*1024.+0.5)
- * (cos(atan(index/100.0))*1024.+0.5)
- * To use, get rational tangent between 0<=tan<=1, scale by 100,
- * and look up sin and cos, and use linear interpolation. divide by 1024.
- * Maximum error is 0.0020. Without linear interpolation, it's 0.010.
- */
- static
- short sinus[] = {
- 0, /* 0.00 */
- 10, /* 0.01 */
- 20, /* 0.02 */
- 31, /* 0.03 */
- 41, /* 0.04 */
- 51, /* 0.05 */
- 61, /* 0.06 */
- 72, /* 0.07 */
- 82, /* 0.08 */
- 92, /* 0.09 */
- 102, /* 0.10 */
- 112, /* 0.11 */
- 122, /* 0.12 */
- 132, /* 0.13 */
- 142, /* 0.14 */
- 152, /* 0.15 */
- 162, /* 0.16 */
- 172, /* 0.17 */
- 181, /* 0.18 */
- 191, /* 0.19 */
- 201, /* 0.20 */
- 210, /* 0.21 */
- 220, /* 0.22 */
- 230, /* 0.23 */
- 239, /* 0.24 */
- 248, /* 0.25 */
- 258, /* 0.26 */
- 267, /* 0.27 */
- 276, /* 0.28 */
- 285, /* 0.29 */
- 294, /* 0.30 */
- 303, /* 0.31 */
- 312, /* 0.32 */
- 321, /* 0.33 */
- 330, /* 0.34 */
- 338, /* 0.35 */
- 347, /* 0.36 */
- 355, /* 0.37 */
- 364, /* 0.38 */
- 372, /* 0.39 */
- 380, /* 0.40 */
- 388, /* 0.41 */
- 397, /* 0.42 */
- 405, /* 0.43 */
- 412, /* 0.44 */
- 420, /* 0.45 */
- 428, /* 0.46 */
- 436, /* 0.47 */
- 443, /* 0.48 */
- 451, /* 0.49 */
- 458, /* 0.50 */
- 465, /* 0.51 */
- 472, /* 0.52 */
- 480, /* 0.53 */
- 487, /* 0.54 */
- 493, /* 0.55 */
- 500, /* 0.56 */
- 507, /* 0.57 */
- 514, /* 0.58 */
- 520, /* 0.59 */
- 527, /* 0.60 */
- 533, /* 0.61 */
- 540, /* 0.62 */
- 546, /* 0.63 */
- 552, /* 0.64 */
- 558, /* 0.65 */
- 564, /* 0.66 */
- 570, /* 0.67 */
- 576, /* 0.68 */
- 582, /* 0.69 */
- 587, /* 0.70 */
- 593, /* 0.71 */
- 598, /* 0.72 */
- 604, /* 0.73 */
- 609, /* 0.74 */
- 614, /* 0.75 */
- 620, /* 0.76 */
- 625, /* 0.77 */
- 630, /* 0.78 */
- 635, /* 0.79 */
- 640, /* 0.80 */
- 645, /* 0.81 */
- 649, /* 0.82 */
- 654, /* 0.83 */
- 659, /* 0.84 */
- 663, /* 0.85 */
- 668, /* 0.86 */
- 672, /* 0.87 */
- 676, /* 0.88 */
- 681, /* 0.89 */
- 685, /* 0.90 */
- 689, /* 0.91 */
- 693, /* 0.92 */
- 697, /* 0.93 */
- 701, /* 0.94 */
- 705, /* 0.95 */
- 709, /* 0.96 */
- 713, /* 0.97 */
- 717, /* 0.98 */
- 720, /* 0.99 */
- 724, /* 1.00 */
- 728, /* 1.01 */
- };
- static
- short cosinus[] = {
- 1024, /* 0.00 */
- 1024, /* 0.01 */
- 1024, /* 0.02 */
- 1024, /* 0.03 */
- 1023, /* 0.04 */
- 1023, /* 0.05 */
- 1022, /* 0.06 */
- 1022, /* 0.07 */
- 1021, /* 0.08 */
- 1020, /* 0.09 */
- 1019, /* 0.10 */
- 1018, /* 0.11 */
- 1017, /* 0.12 */
- 1015, /* 0.13 */
- 1014, /* 0.14 */
- 1013, /* 0.15 */
- 1011, /* 0.16 */
- 1010, /* 0.17 */
- 1008, /* 0.18 */
- 1006, /* 0.19 */
- 1004, /* 0.20 */
- 1002, /* 0.21 */
- 1000, /* 0.22 */
- 998, /* 0.23 */
- 996, /* 0.24 */
- 993, /* 0.25 */
- 991, /* 0.26 */
- 989, /* 0.27 */
- 986, /* 0.28 */
- 983, /* 0.29 */
- 981, /* 0.30 */
- 978, /* 0.31 */
- 975, /* 0.32 */
- 972, /* 0.33 */
- 969, /* 0.34 */
- 967, /* 0.35 */
- 963, /* 0.36 */
- 960, /* 0.37 */
- 957, /* 0.38 */
- 954, /* 0.39 */
- 951, /* 0.40 */
- 947, /* 0.41 */
- 944, /* 0.42 */
- 941, /* 0.43 */
- 937, /* 0.44 */
- 934, /* 0.45 */
- 930, /* 0.46 */
- 927, /* 0.47 */
- 923, /* 0.48 */
- 920, /* 0.49 */
- 916, /* 0.50 */
- 912, /* 0.51 */
- 909, /* 0.52 */
- 905, /* 0.53 */
- 901, /* 0.54 */
- 897, /* 0.55 */
- 893, /* 0.56 */
- 890, /* 0.57 */
- 886, /* 0.58 */
- 882, /* 0.59 */
- 878, /* 0.60 */
- 874, /* 0.61 */
- 870, /* 0.62 */
- 866, /* 0.63 */
- 862, /* 0.64 */
- 859, /* 0.65 */
- 855, /* 0.66 */
- 851, /* 0.67 */
- 847, /* 0.68 */
- 843, /* 0.69 */
- 839, /* 0.70 */
- 835, /* 0.71 */
- 831, /* 0.72 */
- 827, /* 0.73 */
- 823, /* 0.74 */
- 819, /* 0.75 */
- 815, /* 0.76 */
- 811, /* 0.77 */
- 807, /* 0.78 */
- 804, /* 0.79 */
- 800, /* 0.80 */
- 796, /* 0.81 */
- 792, /* 0.82 */
- 788, /* 0.83 */
- 784, /* 0.84 */
- 780, /* 0.85 */
- 776, /* 0.86 */
- 773, /* 0.87 */
- 769, /* 0.88 */
- 765, /* 0.89 */
- 761, /* 0.90 */
- 757, /* 0.91 */
- 754, /* 0.92 */
- 750, /* 0.93 */
- 746, /* 0.94 */
- 742, /* 0.95 */
- 739, /* 0.96 */
- 735, /* 0.97 */
- 731, /* 0.98 */
- 728, /* 0.99 */
- 724, /* 1.00 */
- 720, /* 1.01 */
- };
- void
- icossin2(int x, int y, int *cosp, int *sinp)
- {
- int sinsign, cossign, tan, tan10, rem;
- short *stp, *ctp;
- if(x == 0){
- if(y >= 0)
- *sinp = ICOSSCALE, *cosp = 0;
- else
- *sinp = -ICOSSCALE, *cosp = 0;
- return;
- }
- sinsign = cossign = 1;
- if(x < 0){
- cossign = -1;
- x = -x;
- }
- if(y < 0){
- sinsign = -1;
- y = -y;
- }
- if(y > x){
- tan = 1000*x/y;
- tan10 = tan/10;
- stp = &cosinus[tan10];
- ctp = &sinus[tan10];
- }else{
- tan = 1000*y/x;
- tan10 = tan/10;
- stp = &sinus[tan10];
- ctp = &cosinus[tan10];
- }
- rem = tan-(tan10*10);
- *sinp = sinsign*(stp[0]+(stp[1]-stp[0])*rem/10);
- *cosp = cossign*(ctp[0]+(ctp[1]-ctp[0])*rem/10);
- }
|