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