Simplify fix_sin/fix_cos calls

This commit is contained in:
Kp 2015-04-29 03:35:09 +00:00
parent e30e0ebb94
commit a5b83d19de
2 changed files with 56 additions and 26 deletions

View file

@ -125,24 +125,31 @@ u_int32_t quad_sqrt (quadint);
__attribute_warn_unused_result
fix fix_sqrt (fix a);
struct fix_sincos_result
{
fix sin, cos;
};
__attribute_warn_unused_result
fix_sincos_result fix_sincos(fix);
//compute sine and cosine of an angle, filling in the variables
//either of the pointers can be NULL
void fix_sincos (fix a, fix * s, fix * c); //with interpolation
static inline void fix_sincos (fix a, fix *s, fix *c) //with interpolation
{
const auto &r = fix_sincos(a);
if (s)
*s = r.sin;
if (c)
*c = r.cos;
}
void fix_sincos(fix, std::nullptr_t, std::nullptr_t) = delete;
__attribute_warn_unused_result
static inline fix fix_sin(fix a)
{
fix s;
return fix_sincos(a, &s, nullptr), s;
}
fix fix_sin(fix a);
__attribute_warn_unused_result
static inline fix fix_cos(fix a)
{
fix c;
return fix_sincos(a, nullptr, &c), c;
}
fix fix_cos(fix a);
__attribute_warn_unused_result
fix fix_fastsin(fix a); //no interpolation

View file

@ -20,6 +20,21 @@
#define EPSILON (F1_0/100)
namespace {
class fix_sincos_input
{
public:
const unsigned m_idx, m_mul;
fix_sincos_input(fix a) :
m_idx(static_cast<uint8_t>(a >> 8)),
m_mul(static_cast<uint8_t>(a))
{
}
};
}
fix64 fixmul64(fix a, fix b)
{
const fix64 a64 = a;
@ -199,28 +214,36 @@ fix fix_sqrt(fix a)
return static_cast<fix>(long_sqrt(a)) << 8;
}
static fix fix_sin(const fix_sincos_input sci)
{
fix ss = sincos_table[sci.m_idx];
return (ss + (((sincos_table[sci.m_idx + 1] - ss) * sci.m_mul) >> 8)) << 2;
}
__attribute_warn_unused_result
static fix fix_cos(const fix_sincos_input sci)
{
fix cc = sincos_table[sci.m_idx + 64];
return (cc + (((sincos_table[sci.m_idx + 64 + 1] - cc) * sci.m_mul) >> 8)) << 2;
}
//compute sine and cosine of an angle, filling in the variables
//either of the pointers can be NULL
//with interpolation
void fix_sincos(fix a,fix *s,fix *c)
fix_sincos_result fix_sincos(fix a)
{
int i,f;
fix_sincos_input i(a);
return {fix_sin(i), fix_cos(i)};
}
i = (a>>8)&0xff;
f = a&0xff;
fix fix_sin(fix a)
{
return fix_sin(fix_sincos_input{a});
}
if (s)
{
fix ss = sincos_table[i];
*s = (ss + (((sincos_table[i+1] - ss) * f)>>8))<<2;
}
if (c)
{
fix cc = sincos_table[i+64];
*c = (cc + (((sincos_table[i+64+1] - cc) * f)>>8))<<2;
}
fix fix_cos(fix a)
{
return fix_cos(fix_sincos_input{a});
}
//compute sine and cosine of an angle, filling in the variables