9fans.net/go@v0.0.5/draw/icossin2.go (about) 1 package draw 2 3 const ICOSSCALE = 1024 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 var sinus1 = [...]int16{ 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 var cosinus1 = [...]int16{ 119 1024, /* 0.00 */ 120 1024, /* 0.01 */ 121 1024, /* 0.02 */ 122 1024, /* 0.03 */ 123 1023, /* 0.04 */ 124 1023, /* 0.05 */ 125 1022, /* 0.06 */ 126 1022, /* 0.07 */ 127 1021, /* 0.08 */ 128 1020, /* 0.09 */ 129 1019, /* 0.10 */ 130 1018, /* 0.11 */ 131 1017, /* 0.12 */ 132 1015, /* 0.13 */ 133 1014, /* 0.14 */ 134 1013, /* 0.15 */ 135 1011, /* 0.16 */ 136 1010, /* 0.17 */ 137 1008, /* 0.18 */ 138 1006, /* 0.19 */ 139 1004, /* 0.20 */ 140 1002, /* 0.21 */ 141 1000, /* 0.22 */ 142 998, /* 0.23 */ 143 996, /* 0.24 */ 144 993, /* 0.25 */ 145 991, /* 0.26 */ 146 989, /* 0.27 */ 147 986, /* 0.28 */ 148 983, /* 0.29 */ 149 981, /* 0.30 */ 150 978, /* 0.31 */ 151 975, /* 0.32 */ 152 972, /* 0.33 */ 153 969, /* 0.34 */ 154 967, /* 0.35 */ 155 963, /* 0.36 */ 156 960, /* 0.37 */ 157 957, /* 0.38 */ 158 954, /* 0.39 */ 159 951, /* 0.40 */ 160 947, /* 0.41 */ 161 944, /* 0.42 */ 162 941, /* 0.43 */ 163 937, /* 0.44 */ 164 934, /* 0.45 */ 165 930, /* 0.46 */ 166 927, /* 0.47 */ 167 923, /* 0.48 */ 168 920, /* 0.49 */ 169 916, /* 0.50 */ 170 912, /* 0.51 */ 171 909, /* 0.52 */ 172 905, /* 0.53 */ 173 901, /* 0.54 */ 174 897, /* 0.55 */ 175 893, /* 0.56 */ 176 890, /* 0.57 */ 177 886, /* 0.58 */ 178 882, /* 0.59 */ 179 878, /* 0.60 */ 180 874, /* 0.61 */ 181 870, /* 0.62 */ 182 866, /* 0.63 */ 183 862, /* 0.64 */ 184 859, /* 0.65 */ 185 855, /* 0.66 */ 186 851, /* 0.67 */ 187 847, /* 0.68 */ 188 843, /* 0.69 */ 189 839, /* 0.70 */ 190 835, /* 0.71 */ 191 831, /* 0.72 */ 192 827, /* 0.73 */ 193 823, /* 0.74 */ 194 819, /* 0.75 */ 195 815, /* 0.76 */ 196 811, /* 0.77 */ 197 807, /* 0.78 */ 198 804, /* 0.79 */ 199 800, /* 0.80 */ 200 796, /* 0.81 */ 201 792, /* 0.82 */ 202 788, /* 0.83 */ 203 784, /* 0.84 */ 204 780, /* 0.85 */ 205 776, /* 0.86 */ 206 773, /* 0.87 */ 207 769, /* 0.88 */ 208 765, /* 0.89 */ 209 761, /* 0.90 */ 210 757, /* 0.91 */ 211 754, /* 0.92 */ 212 750, /* 0.93 */ 213 746, /* 0.94 */ 214 742, /* 0.95 */ 215 739, /* 0.96 */ 216 735, /* 0.97 */ 217 731, /* 0.98 */ 218 728, /* 0.99 */ 219 724, /* 1.00 */ 220 720, /* 1.01 */ 221 } 222 223 // IntCosSin2 returns scaled integers representing the cosine and sine 224 // of the angle defined by the point (x, y). 225 // The values are scaled by ICOSSCALE (1024), so that cos(0) is 1024. 226 // IntCosSin2 is to IntCosSin what math.Atan2 is to math.Atan. 227 func IntCosSin2(x, y int) (cos, sin int) { 228 if x == 0 { 229 if y >= 0 { 230 sin, cos = ICOSSCALE, 0 231 } else { 232 sin, cos = -ICOSSCALE, 0 233 } 234 return 235 } 236 237 sinsign := 1 238 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 var tan, tan10 int 248 var stp, ctp []int16 249 if y > x { 250 tan = 1000 * x / y 251 tan10 = tan / 10 252 stp = cosinus1[tan10:] 253 ctp = sinus1[tan10:] 254 } else { 255 tan = 1000 * y / x 256 tan10 = tan / 10 257 stp = sinus1[tan10:] 258 ctp = cosinus1[tan10:] 259 } 260 rem := tan - tan10*10 261 sin = sinsign * (int(stp[0]) + int(stp[1]-stp[0])*rem/10) 262 cos = cossign * (int(ctp[0]) + int(ctp[1]-ctp[0])*rem/10) 263 return 264 }