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