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
00033 #ifndef _MATHUTIL_H
00034 #define _MATHUTIL_H
00035
00036 #include <math.h>
00037 #include <stdlib.h>
00038 #include <stdint.h>
00039 #include <assert.h>
00040
00041 #ifndef PI
00042 #define PI 3.14159265358979323846264338
00043 #endif
00044
00045 #define to_radians(x) ( (x) * (PI / 180.0 ))
00046 #define to_degrees(x) ( (x) * (180.0 / M_PI ))
00047
00048 static inline double sq(double v)
00049 {
00050 return v*v;
00051 }
00052
00053 static inline double sgn(double v)
00054 {
00055 return (v>=0) ? 1 : -1;
00056 }
00057
00058
00059 static inline float randf()
00060 {
00061 return ((float) rand()) / (RAND_MAX + 1.0);
00062 }
00063
00064 static inline float signed_randf()
00065 {
00066 return randf()*2 - 1;
00067 }
00068
00069
00070 static inline int irand(int bound)
00071 {
00072 int v = (int) (randf()*bound);
00073 assert(v >= 0);
00074 assert(v < bound);
00075 return v;
00076 }
00077
00078 #define TWOPI_INV (0.5/PI)
00079 #define TWOPI (2*PI)
00080
00082 static inline double mod2pi_positive(double vin)
00083 {
00084 double q = vin * TWOPI_INV + 0.5;
00085 int qi = (int) q;
00086
00087 return vin - qi*TWOPI;
00088 }
00089
00091 static inline double mod2pi(double vin)
00092 {
00093 if (vin < 0)
00094 return -mod2pi_positive(-vin);
00095 else
00096 return mod2pi_positive(vin);
00097 }
00098
00100 static inline double mod2pi_ref(double ref, double vin)
00101 {
00102 return ref + mod2pi(vin - ref);
00103 }
00104
00105 static inline int theta_to_int(double theta, int max)
00106 {
00107 theta = mod2pi_ref(PI, theta);
00108 int v = (int) (theta / ( 2 * PI ) * max);
00109
00110 if (v==max)
00111 v = 0;
00112
00113 assert (v >= 0 && v < max);
00114
00115 return v;
00116 }
00117
00118 static inline int imin(int a, int b)
00119 {
00120 return (a < b) ? a : b;
00121 }
00122
00123 static inline int imax(int a, int b)
00124 {
00125 return (a > b) ? a : b;
00126 }
00127
00128 static inline int64_t imin64(int64_t a, int64_t b)
00129 {
00130 return (a < b) ? a : b;
00131 }
00132
00133 static inline int64_t imax64(int64_t a, int64_t b)
00134 {
00135 return (a > b) ? a : b;
00136 }
00137
00138 static inline int iclamp(int v, int minv, int maxv)
00139 {
00140 return imax(minv, imin(v, maxv));
00141 }
00142
00143 static inline double fclamp(double v, double minv, double maxv)
00144 {
00145 return fmax(minv, fmin(v, maxv));
00146 }
00147
00148 #endif
00149