icossin2.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <draw.h>
  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. static
  118. short cosinus[] = {
  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. void
  223. icossin2(int x, int y, int *cosp, int *sinp)
  224. {
  225. int sinsign, cossign, tan, tan10, rem;
  226. short *stp, *ctp;
  227. if(x == 0){
  228. if(y >= 0)
  229. *sinp = ICOSSCALE, *cosp = 0;
  230. else
  231. *sinp = -ICOSSCALE, *cosp = 0;
  232. return;
  233. }
  234. sinsign = cossign = 1;
  235. if(x < 0){
  236. cossign = -1;
  237. x = -x;
  238. }
  239. if(y < 0){
  240. sinsign = -1;
  241. y = -y;
  242. }
  243. if(y > x){
  244. tan = 1000*x/y;
  245. tan10 = tan/10;
  246. stp = &cosinus[tan10];
  247. ctp = &sinus[tan10];
  248. }else{
  249. tan = 1000*y/x;
  250. tan10 = tan/10;
  251. stp = &sinus[tan10];
  252. ctp = &cosinus[tan10];
  253. }
  254. rem = tan-(tan10*10);
  255. *sinp = sinsign*(stp[0]+(stp[1]-stp[0])*rem/10);
  256. *cosp = cossign*(ctp[0]+(ctp[1]-ctp[0])*rem/10);
  257. }