diff --git a/src/Triangle.cpp b/src/Triangle.cpp index a850b586..d2363163 100644 --- a/src/Triangle.cpp +++ b/src/Triangle.cpp @@ -8,19 +8,19 @@ int16_t gTan[0x21]; void InitTriangleTable() { + int i; + //Sine - for (int i = 0; i < 0x100; ++i ) + for (i = 0; i < 0x100; ++i) { - float v0 = i * 6.2831998 / 256.0; - gSin[i] = (int)(sinf(v0) * 512.0); + gSin[i] = (int)(sin(i * 6.2831998 / 256.0) * 512.0); } //Tangent - for (int i = 0; i < 0x21; ++i ) + for (i = 0; i < 0x21; ++i) { float a = i * 6.2831855 / 256.0; - float v2 = sinf(a); - float b = v2 / cosf(a); + float b = sinf(a) / cosf(a); gTan[i] = (int16_t)(b * 8192.0); } } @@ -32,70 +32,89 @@ int GetSin(uint8_t deg) int GetCos(uint8_t deg) { - return gSin[(uint8_t)(deg + 0x40)]; + deg += 0x40; + return gSin[deg]; } -int GetArktan(int x, int y) +uint8_t GetArktan(int x, int y) { - int xa = -x; - int ya = -y; + x *= -1; + y *= -1; uint8_t a = 0; - - if (xa <= 0) + int16_t k; + + if (x > 0) { - if (ya <= 0) + if (y > 0) { - if (-xa <= -ya) + if (x > y) { - while (gTan[a] < (int16_t)(-0x2000 * xa / -ya)) + k = (y * 0x2000) / x; + while (k > gTan[a]) ++a; - a = -0x40 - a; } else { - while (gTan[a] < (int16_t)(-0x2000 * ya / -xa)) + k = (x * 0x2000) / y; + while (k > gTan[a]) ++a; - a += -0x80; + a = 0x40 - a; } } - 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; + if (-y < x) + { + k = (-y * 0x2000) / x; + while (k > gTan[a]) + ++a; + a = 0x100 - a; + } + else + { + k = (x * 0x2000) / -y; + while (k > gTan[a]) + ++a; + a = 0x100 - 0x40 + 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; + if (y > 0) + { + if (-x > y) + { + k = (y * 0x2000) / -x; + while (k > gTan[a]) + ++a; + a = 0x80 - a; + } + else + { + k = (-x * 0x2000) / y; + while (k > gTan[a]) + ++a; + a = 0x40 + a; + } + } + else + { + if (-x > -y) + { + k = (-y * 0x2000) / -x; + while (k > gTan[a]) + ++a; + a = 0x80 + a; + } + else + { + k = (-x * 0x2000) / -y; + while (k > gTan[a]) + ++a; + a = 0x100 - 0x40 - a; + } + } } return a; diff --git a/src/Triangle.h b/src/Triangle.h index 8d2ab68a..400761a5 100644 --- a/src/Triangle.h +++ b/src/Triangle.h @@ -5,4 +5,4 @@ void InitTriangleTable(); int GetSin(uint8_t deg); int GetCos(uint8_t deg); -int GetArktan(int x, int y); +uint8_t GetArktan(int x, int y);