cave-story-solaris/src/Triangle.cpp
2019-02-18 21:30:22 +00:00

102 lines
No EOL
1.4 KiB
C++

#include "Triangle.h"
#include <stdint.h>
#include <math.h>
int gSin[0x100];
int16_t gTan[0x21];
void InitTriangleTable()
{
//Sine
for (int i = 0; i < 0x100; ++i )
{
float v0 = i * 6.2831998 / 256.0;
gSin[i] = (int)(sinf(v0) * 512.0);
}
//Tangent
for (int i = 0; i < 0x21; ++i )
{
float a = i * 6.2831855 / 256.0;
float v2 = sinf(a);
float b = v2 / cosf(a);
gTan[i] = (int16_t)(b * 8192.0);
}
}
int GetSin(uint8_t deg)
{
return gSin[deg];
}
int GetCos(uint8_t deg)
{
return gSin[(uint8_t)(deg + 0x40)];
}
int GetArktan(int x, int y)
{
int xa = -x;
int ya = -y;
uint8_t a = 0;
if (xa <= 0)
{
if (ya <= 0)
{
if (-xa <= -ya)
{
while (gTan[a] < (int16_t)(-0x2000 * xa / -ya))
++a;
a = -0x40 - a;
}
else
{
while (gTan[a] < (int16_t)(-0x2000 * ya / -xa))
++a;
a += -0x80;
}
}
else if (-xa <= ya)
{
while (gTan[a] < (int16_t)(-0x2000 * xa / ya))
++a;
a += 0x40;
}
else
{
while (gTan[a] < (int16_t)((ya << 13) / -xa))
++a;
a = -0x80 - a;
}
}
else if (ya <= 0)
{
if (-ya >= xa)
{
while (gTan[a] < (int16_t)((xa << 13) / -ya))
++a;
a -= 0x40;
}
else
{
while (gTan[a] < (int16_t)(-0x2000 * ya / xa))
++a;
a = -a;
}
}
else if (xa <= ya)
{
while (gTan[a] < (int16_t)((xa << 13) / ya))
++a;
a = 0x40 - a;
}
else
{
while (gTan[a] < (int16_t)((ya << 13) / xa))
++a;
}
return a;
}