#include"atan.h"
// Need for extra level:
// the LUT and access functions were used for calculating
// angle theta-Y on the x-z plane;
// this ratan stub converts back to proper theta-Z on xy plane
int ratan (int x, int y)
{
int angle = SUBratan(x, y);
angle = 1024 - angle;
if (angle < 0)
angle += 2048;
if (angle > 2048)
angle -= 2048;
return angle;
}
// call with value as actual value * ONE
int ratan2 (int value)
{
return ( ratan(ONE, value) );
}
// Note: origin (x,z)=(0,1), clockwise rotation
// this was originally done for atan on the x-z plane
int SUBratan (int x, int z)
{
if (x*z == 0) // if either is zero
return(ratan_zero(x,z));
if (x>0)
{
if (z>0)
{
x = abs(x);
z = abs(z);
if (x<=z)
return(ArcTangentTable[255*x/z]);
else
return(1024-ArcTangentTable[255*z/x]);
}
else
{
x = abs(x);
z = abs(z);
if (x<=z)
return(2048-ArcTangentTable[255*x/z]);
else
return(1024+ArcTangentTable[255*z/x]);
}
}
else
{
if (z>0)
{
x = abs(x);
z = abs(z);
if (x<=z)
return(-ArcTangentTable[255*x/z]);
else
return(-1024+ArcTangentTable[255*z/x]);
}
else
{
x = abs(x);
z = abs(z);
if (x<=z)
return(-2048+ArcTangentTable[255*x/z]);
else
return(-1024-ArcTangentTable[255*z/x]);
}
}
}
int ratan_zero (int x, int z)
{
if (x == 0)
{
if(z >= 0)
return(0);
else
return(2048);
}
else if (z == 0)
{
if(x > 0)
return(1024);
else
return(-1024);
}
else
return(0);
}
int ArcTangentTable[256] =
{
2, 5, 7, 10, 12, 15, 17, 20,
22, 25, 27, 30, 33, 35, 38, 40,
43, 45, 48, 50, 53, 55, 58, 60,
63, 65, 68, 71, 73, 76, 78, 81,
83, 86, 88, 91, 93, 96, 98, 101,
103, 106, 108, 110, 113, 115, 118, 120,
123, 125, 128, 130, 133, 135, 137, 140,
142, 145, 147, 150, 152, 154, 157, 159,
162, 164, 166, 169, 171, 174, 176, 178,
181, 183, 185, 188, 190, 192, 195, 197,
199, 202, 204, 206, 208, 211, 213, 215,
218, 220, 222, 224, 227, 229, 231, 233,
236, 238, 240, 242, 244, 247, 249, 251,
253, 255, 258, 260, 262, 264, 266, 268,
270, 273, 275, 277, 279, 281, 283, 285,
287, 289, 291, 294, 296, 298, 300, 302,
304, 306, 308, 310, 312, 314, 316, 318,
320, 322, 324, 326, 328, 330, 332, 334,
335, 337, 339, 341, 343, 345, 347, 349,
351, 353, 354, 356, 358, 360, 362, 364,
365, 367, 369, 371, 373, 375, 376, 378,
380, 382, 383, 385, 387, 389, 390, 392,
394, 396, 397, 399, 401, 402, 404, 406,
407, 409, 411, 412, 414, 416, 417, 419,
421, 422, 424, 425, 427, 429, 430, 432,
433, 435, 437, 438, 440, 441, 443, 444,
446, 447, 449, 450, 452, 453, 455, 456,
458, 459, 461, 462, 464, 465, 467, 468,
470, 471, 472, 474, 475, 477, 478, 479,
481, 482, 484, 485, 486, 488, 489, 490,
492, 493, 495, 496, 497, 499, 500, 501,
502, 504, 505, 506, 508, 509, 510, 512
};