00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00030 #ifndef COURNIA_MATHEMATICS_H
00031 #define COURNIA_MATHEMATICS_H 1
00032
00034 typedef float real_t;
00035
00036 #include <cstdlib>
00037 #include <cmath>
00038
00039
00041 #define MATH_EPSILON 0.00001
00042
00044 namespace math {
00045
00047 inline double
00048 rand01( void )
00049 {
00050 return (rand( ) / (double)RAND_MAX);
00051 }
00052
00054
00058 inline double
00059 to_degrees( double x )
00060 {
00061 return (x * 180.0 / M_PI);
00062 }
00063
00065
00069 inline double
00070 to_radians( double x )
00071 {
00072 return (x * M_PI / 180.0);
00073 }
00074
00076
00080 inline bool
00081 equals( double x, double y )
00082 {
00083 return (std::fabs( x - y ) < MATH_EPSILON);
00084 }
00085
00087
00095 template <class T>
00096 inline void
00097 swap( T& x, T& y )
00098 {
00099 T z = x;
00100 x = y;
00101 y = z;
00102 }
00103
00105
00108 inline double
00109 sign( double x )
00110 {
00111 if( x < 0.0 ) {
00112 return -1.0;
00113 } else {
00114 return 1.0;
00115 }
00116 }
00117
00119
00122 inline bool
00123 same_sign( double x, double y )
00124 {
00125 if( x * y >= 0.0 ) {
00126 return true;
00127 } else {
00128 return false;
00129 }
00130 }
00131
00133
00136 inline bool
00137 negative( double x )
00138 {
00139 if( x < 0.0 ) {
00140 return true;
00141 } else {
00142 return false;
00143 }
00144 }
00145
00147
00150 inline bool
00151 positive( double x )
00152 {
00153 if( x < 0.0 ) {
00154 return false;
00155 } else {
00156 return true;
00157 }
00158 }
00159
00161
00162
00163
00164 inline float
00165 angle_normalize_360( float angle )
00166 {
00167 return (360.0 / 65536) * ((int)(angle * (65536 / 360.0)) & 65535);
00168 }
00169
00171 inline float
00172 angle_normalize_180( float angle )
00173 {
00174 angle = angle_normalize_360( angle );
00175 if( angle > 180.0 ) {
00176 angle -= 360.0;
00177 }
00178 return angle;
00179 }
00180
00182 inline float
00183 angle_subtract( float a, float b )
00184 {
00185 return angle_normalize_180( a - b );
00186 }
00187
00188
00190
00191
00192
00193
00194
00195
00196 template <class T>
00197 inline T
00198 clamp( T value, T min, T max )
00199 {
00200 if( value < min ) {
00201
00202 return min;
00203 }
00204
00205 if( value > max ) {
00206
00207 return max;
00208 }
00209
00210
00211 return value;
00212 }
00213
00214 }
00215
00216 #endif