#include #include #include #include "math/fast_math.h" /** * Fast sine and cosine implementation. * * See http://lab.polygonal.de/?p=205 * * @param angle * The angle in radians * WARNING: Don't use too large angles. * * @param sin * A pointer to store the sine value. * * @param cos * A pointer to store the cosine value. */ void fast_sincos(float angle, float *sin, float *cos) { //always wrap input angle to -PI..PI while (angle < -M_PI) { angle += 2.0f * M_PI; } while (angle > M_PI) { angle -= 2.0f * M_PI; } //compute sine if (angle < 0.0f) { *sin = 1.27323954f * angle + 0.405284735f * angle * angle; if (*sin < 0.0f) { *sin = 0.225f * (*sin * -*sin - *sin) + *sin; } else { *sin = 0.225f * (*sin * *sin - *sin) + *sin; } } else { *sin = 1.27323954f * angle - 0.405284735f * angle * angle; if (*sin < 0.0f) { *sin = 0.225f * (*sin * -*sin - *sin) + *sin; } else { *sin = 0.225f * (*sin * *sin - *sin) + *sin; } } // compute cosine: sin(x + PI/2) = cos(x) angle += 0.5f * M_PI; if (angle > M_PI) { angle -= 2.0f * M_PI; } if (angle < 0.0f) { *cos = 1.27323954f * angle + 0.405284735f * angle * angle; if (*cos < 0.0f) { *cos = 0.225f * (*cos * -*cos - *cos) + *cos; } else { *cos = 0.225f * (*cos * *cos - *cos) + *cos; } } else { *cos = 1.27323954f * angle - 0.405284735f * angle * angle; if (*cos < 0.0f) { *cos = 0.225f * (*cos * -*cos - *cos) + *cos; } else { *cos = 0.225f * (*cos * *cos - *cos) + *cos; } } } /** * Make sure that 0 <= angle < 360 * * @param angle * The angle to normalize. */ void fast_norm_angle(float *angle) { *angle = fmodf(*angle, 360.0f); if (*angle < 0.0f) { *angle += 360.0f; } } void normal_sincosf(float angle, float *sin, float *cos) { *sin = sinf(angle); *cos = cosf(angle); }