00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef GRINLIZ_MATH_INCLUDED
00027 #define GRINLIZ_MATH_INCLUDED
00028
00029 #include <math.h>
00030 #include "glutil.h"
00031
00032 namespace grinliz
00033 {
00034 const float PI = 3.1415926535897932384626433832795f;
00035 const double PI_D = 3.1415926535897932384626433832795;
00036
00037 const float RAD_TO_DEG = (float)( 360.0 / ( 2.0 * PI ) );
00038 const float DEG_TO_RAD = (float)( ( 2.0 * PI ) / 360.0 );
00039 const float SQRT2 = 1.4142135623730950488016887242097f;
00040 const float SQRT2OVER2 = float( 1.4142135623730950488016887242097 / 2.0 );
00041
00042 const float EPSILON = 0.000001f;
00043
00045 inline bool Equal( float x, float y, float epsilon )
00046 {
00047 return fabs( (double)(x - y) ) <= (double)epsilon;
00048 }
00049 inline bool Equal( double x, double y, double epsilon )
00050 {
00051 return fabs( x - y ) <= epsilon;
00052 }
00053
00060 void DegDelta( float angle0, float angle1, float* distance, float* bias );
00061
00063 inline float Length( float x, float y )
00064 {
00065
00066
00067
00068
00069
00070 return sqrtf( x*x + y*y );
00071 }
00072
00073 inline double Length( double x, double y )
00074 {
00075
00076 return sqrt( x*x + y*y );
00077 }
00078
00080 inline float Length( float x, float y, float z )
00081 {
00082 return sqrtf( x*x + y*y + z*z );
00083 }
00084
00085 inline double Length( double x, double y, double z )
00086 {
00087 return sqrt( x*x + y*y + z*z );
00088 }
00089
00091 inline float Length( float x, float y, float z, float w )
00092 {
00093 return sqrtf( x*x + y*y + z*z + w*w );
00094 }
00095
00096
00098 template <class T> inline T FastLength( T x, T y, T z )
00099 {
00100 float a = (float) fabs( x );
00101 float b = (float) fabs( y );
00102 float c = (float) fabs( z );
00103
00104 if ( b > a ) Swap( &b, &a );
00105 if ( c > a ) Swap( &c, &a );
00106
00107
00108
00109
00110 float ret = a + ( b + c ) / 4;
00111 return ret;
00112 }
00113
00114
00116 template <class T> inline T FastLength( T x, T y )
00117 {
00118 float a = (float) fabs( x );
00119 float b = (float) fabs( y );
00120
00121 if ( b > a ) grinliz::Swap( &b, &a );
00122
00123
00124
00125
00126 float ret = a + b / 4;
00127 return ret;
00128 }
00129
00131 template <class T> inline T Average( T y0, T y1 )
00132 {
00133 return ( y0 + y1 ) / T( 2 );
00134 }
00135
00136
00137
00138 };
00139
00140 #endif