Blob
1 #include <u.h>2 #include <libc.h>3 #include <draw.h>5 /*6 * Sine and Cosine of arctangents, calculated by7 * (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 static14 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 };119 static120 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 };225 void226 icossin2(int x, int y, int *cosp, int *sinp)227 {228 int sinsign, cossign, tan, tan10, rem;229 short *stp, *ctp;231 if(x == 0){232 if(y >= 0)233 *sinp = ICOSSCALE, *cosp = 0;234 else235 *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 }