00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "mathutils.h"
00024
00025 #include <cmath>
00026 #include <float.h>
00027
00028 #define MATH_UTILS_MAX_ANGLE 360
00029
00030 float sinList[MATH_UTILS_MAX_ANGLE];
00031 float cosList[MATH_UTILS_MAX_ANGLE];
00032 float tanList[MATH_UTILS_MAX_ANGLE];
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 float utils::math::fastInvSqrt(float x)
00048 {
00049 float xhalf = 0.5f * x;
00050 int i = *(int*) &x;
00051 i = 0x5f375a86 - (i >> 1);
00052 x = *(float*) &i;
00053 x = x * (1.5f-xhalf * x * x);
00054 return x;
00055 }
00056
00057 float utils::math::fastSqrt(float x)
00058 {
00059 return 1.0f / utils::math::fastInvSqrt(x);
00060 }
00061
00062 void utils::math::init()
00063 {
00064
00065 const float radianAngleRatio = M_PI_2 / 90.0f;
00066
00067 for (int i = 0; i < MATH_UTILS_MAX_ANGLE; i++)
00068 {
00069 sinList[i] = sin(radianAngleRatio * (float) i);
00070 cosList[i] = cos(radianAngleRatio * (float) i);
00071
00072 if (i == 90)
00073 {
00074 tanList[i] = FLT_MAX;
00075 continue;
00076 }
00077 if (i == 270)
00078 {
00079 tanList[i] = -FLT_MAX;
00080 continue;
00081 }
00082 tanList[i] = tan(radianAngleRatio * (float) i);
00083 }
00084 }
00085
00086 float utils::math::cachedSin(int angle)
00087 {
00088 return sinList[angle];
00089 }
00090
00091 float utils::math::cachedCos(int angle)
00092 {
00093 return cosList[angle];
00094 }
00095
00096 float utils::math::cachedTan(int angle)
00097 {
00098 return tanList[angle];
00099 }