icossin2.c 4.5 KB

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