00001
00002
00003
00004 #ifndef MATH2_H_
00005 #define MATH2_H_ 1
00006
00007 #include "debug/debug.h"
00008 #include <math.h>
00009
00010
00011 #ifndef M_PI
00012 #define M_PI 3.14159265359
00013 #endif
00014
00015 #define ROUNDING_ERROR (1e-5)
00016 #define IsZero(x) (fabs(x)<ROUNDING_ERROR)
00017
00018
00019 template< class T > bool Between( const T value, const T left, const T right );
00020 double Clamp( const double value, const double min, const double max );
00021 double CosDeg( const double value );
00022 template< class T > T Max( const T a, const T b );
00023 double Max( const double a, const double b, const double c );
00024 double Max( const double a, const double b, const double c, const double d );
00025 double Max( const double a, const double b, const double c, const double d, const double e );
00026 template< class T > T Min( const T a, const T b );
00027 double Min( const double a, const double b, const double c );
00028 double Min( const double a, const double b, const double c, const double d );
00029 double MinMag( const double a, const double b );
00030 double MinMag( const double a, const double b, const double c );
00031 template< class T > T OddOneOut( const T a, const T b, const T c );
00032 int Pow( const int a, const int b );
00033 double Rad2Deg( const double radians );
00034 double Deg2Rad( const double degrees );
00035 double RandNorm( const double mean, const double standard_devation );
00036 double SinDeg( const double value );
00037 double Sqr( const double a );
00038 int TwoToThePower( const int power );
00039
00040
00041 template< class T >
00042 bool Between( const T value, const T left, const T right )
00043 {
00044 if( value < math::Min( left, right ) ) return false;
00045 if( value > math::Max( left, right ) ) return false;
00046 return true;
00047 }
00048
00049 namespace math
00050 {
00051 template< class T >
00052 inline T Max( const T a, const T b )
00053 {
00054 if( a > b ) return a;
00055 return b;
00056 }
00057
00058 template< class T >
00059 inline T Min( const T a, const T b )
00060 {
00061 if( a < b ) return a;
00062 return b;
00063 }
00064 }
00065
00066 template< class T >
00067 T OddOneOut( const T a, const T b, const T c )
00068 {
00069 if( a == b )
00070 {
00071 return c;
00072 }
00073
00074 if( b == c )
00075 {
00076 return a;
00077 }
00078
00079 if( c == a )
00080 {
00081 return b;
00082 }
00083 IJG_Assert( false );
00084 return a;
00085 }
00086
00087
00088
00089 #endif