icossin2.c (4586B)
1 #include "u.h" 2 #include "lib.h" 3 #include "draw.h" 4 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 }; 118 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 }; 224 225 void 226 icossin2(int x, int y, int *cosp, int *sinp) 227 { 228 int sinsign, cossign, tan, tan10, rem; 229 short *stp, *ctp; 230 231 if(x == 0){ 232 if(y >= 0) 233 *sinp = ICOSSCALE, *cosp = 0; 234 else 235 *sinp = -ICOSSCALE, *cosp = 0; 236 return; 237 } 238 sinsign = cossign = 1; 239 if(x < 0){ 240 cossign = -1; 241 x = -x; 242 } 243 if(y < 0){ 244 sinsign = -1; 245 y = -y; 246 } 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]; 257 } 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); 261 }