| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #include <math.h>
- #include <string.h>
- #include <stdlib.h>
- #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);
- }
|