Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. #include"atan.h"
  2.  
  3.  
  4.  
  5.  
  6. // Need for extra level:
  7. // the LUT and access functions were used for calculating
  8. // angle theta-Y on the x-z plane;
  9. // this ratan stub converts back to proper theta-Z on xy plane
  10.  
  11. int ratan (int x, int y)
  12. {
  13. int angle = SUBratan(x, y);
  14.  
  15. angle = 1024 - angle;
  16.  
  17. if (angle < 0)
  18. angle += 2048;
  19.  
  20. if (angle > 2048)
  21. angle -= 2048;
  22.  
  23. return angle;
  24. }
  25.  
  26.  
  27.  
  28. // call with value as actual value * ONE
  29. int ratan2 (int value)
  30. {
  31. return ( ratan(ONE, value) );
  32. }
  33.  
  34.  
  35.  
  36.  
  37. // Note: origin (x,z)=(0,1), clockwise rotation
  38. // this was originally done for atan on the x-z plane
  39.  
  40. int SUBratan (int x, int z)
  41. {
  42. if (x*z == 0) // if either is zero
  43. return(ratan_zero(x,z));
  44.  
  45. if (x>0)
  46. {
  47. if (z>0)
  48. {
  49. x = abs(x);
  50. z = abs(z);
  51. if (x<=z)
  52. return(ArcTangentTable[255*x/z]);
  53. else
  54. return(1024-ArcTangentTable[255*z/x]);
  55. }
  56. else
  57. {
  58. x = abs(x);
  59. z = abs(z);
  60. if (x<=z)
  61. return(2048-ArcTangentTable[255*x/z]);
  62. else
  63. return(1024+ArcTangentTable[255*z/x]);
  64. }
  65. }
  66. else
  67. {
  68. if (z>0)
  69. {
  70. x = abs(x);
  71. z = abs(z);
  72. if (x<=z)
  73. return(-ArcTangentTable[255*x/z]);
  74. else
  75. return(-1024+ArcTangentTable[255*z/x]);
  76. }
  77. else
  78. {
  79. x = abs(x);
  80. z = abs(z);
  81. if (x<=z)
  82. return(-2048+ArcTangentTable[255*x/z]);
  83. else
  84. return(-1024-ArcTangentTable[255*z/x]);
  85. }
  86. }
  87. }
  88.  
  89.  
  90.  
  91.  
  92. int ratan_zero (int x, int z)
  93. {
  94. if (x == 0)
  95. {
  96. if(z >= 0)
  97. return(0);
  98. else
  99. return(2048);
  100. }
  101. else if (z == 0)
  102. {
  103. if(x > 0)
  104. return(1024);
  105. else
  106. return(-1024);
  107. }
  108. else
  109. return(0);
  110. }
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121. int ArcTangentTable[256] =
  122. {
  123. 2, 5, 7, 10, 12, 15, 17, 20,
  124. 22, 25, 27, 30, 33, 35, 38, 40,
  125. 43, 45, 48, 50, 53, 55, 58, 60,
  126. 63, 65, 68, 71, 73, 76, 78, 81,
  127. 83, 86, 88, 91, 93, 96, 98, 101,
  128. 103, 106, 108, 110, 113, 115, 118, 120,
  129. 123, 125, 128, 130, 133, 135, 137, 140,
  130. 142, 145, 147, 150, 152, 154, 157, 159,
  131. 162, 164, 166, 169, 171, 174, 176, 178,
  132. 181, 183, 185, 188, 190, 192, 195, 197,
  133. 199, 202, 204, 206, 208, 211, 213, 215,
  134. 218, 220, 222, 224, 227, 229, 231, 233,
  135. 236, 238, 240, 242, 244, 247, 249, 251,
  136. 253, 255, 258, 260, 262, 264, 266, 268,
  137. 270, 273, 275, 277, 279, 281, 283, 285,
  138. 287, 289, 291, 294, 296, 298, 300, 302,
  139. 304, 306, 308, 310, 312, 314, 316, 318,
  140. 320, 322, 324, 326, 328, 330, 332, 334,
  141. 335, 337, 339, 341, 343, 345, 347, 349,
  142. 351, 353, 354, 356, 358, 360, 362, 364,
  143. 365, 367, 369, 371, 373, 375, 376, 378,
  144. 380, 382, 383, 385, 387, 389, 390, 392,
  145. 394, 396, 397, 399, 401, 402, 404, 406,
  146. 407, 409, 411, 412, 414, 416, 417, 419,
  147. 421, 422, 424, 425, 427, 429, 430, 432,
  148. 433, 435, 437, 438, 440, 441, 443, 444,
  149. 446, 447, 449, 450, 452, 453, 455, 456,
  150. 458, 459, 461, 462, 464, 465, 467, 468,
  151. 470, 471, 472, 474, 475, 477, 478, 479,
  152. 481, 482, 484, 485, 486, 488, 489, 490,
  153. 492, 493, 495, 496, 497, 499, 500, 501,
  154. 502, 504, 505, 506, 508, 509, 510, 512
  155. };