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
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 #ifndef __VCGLIB_MATH_BASE
00087 #define __VCGLIB_MATH_BASE
00088
00089 #include <math.h>
00090 #include <assert.h>
00091 #include <limits>
00092 #include <math.h>
00093
00097 #define static_assert assert
00098
00099 #ifdef __BORLANDC__
00100 float sqrtf (float v) {return sqrt(v);}
00101 float fabsf (float v) {return fabs(v);}
00102 float cosf (float v) {return cos(v);}
00103 float sinf (float v) {return sin(v);}
00104 float acosf (float v) {return acos(v);}
00105 float asinf (float v) {return asin(v);}
00106 float atan2f (float v0, float v1) {return atan2(v0,v1);}
00107 #endif
00108
00109 namespace vcg {
00110
00111 namespace math {
00112
00113 template <class SCALAR>
00114 class MagnitudoComparer
00115 {
00116 public:
00117 inline bool operator() ( const SCALAR a, const SCALAR b ) { return fabs(a)>fabs(b); }
00118 };
00119
00120 inline float Sqrt(const short v) { return sqrtf(v); }
00121 inline float Sqrt(const int v) { return sqrtf((float)v); }
00122
00123 inline float Sqrt(const float v) { return sqrtf(v); }
00124 inline float Abs(const float v) { return fabsf(v); }
00125 inline float Cos(const float v) { return cosf(v); }
00126 inline float Sin(const float v) { return sinf(v); }
00127 inline float Acos(const float v) { return acosf(v); }
00128 inline float Asin(const float v) { return asinf(v); }
00129 inline float Atan2(const float v0,const float v1) { return atan2f(v0,v1); }
00130
00131 inline double Sqrt(const double v) { return sqrt(v); }
00132 inline double Abs(const double v) { return fabs(v); }
00133 inline double Cos(const double v) { return cos(v); }
00134 inline double Sin(const double v) { return sin(v); }
00135 inline double Acos(const double v) { return acos(v); }
00136 inline double Asin(const double v) { return asin(v); }
00137 inline double Atan2(const double v0,const double v1) { return atan2(v0,v1); }
00138
00139 template <typename T> inline static T Sqr(T a) { return a*a; }
00140
00141 template<class T> inline const T & Min(const T &a, const T &b){
00142 if (a<b) return a; else return b;
00143 }
00144 template<class T> inline const T & Max(const T &a, const T &b){
00145 if (a<b) return b; else return a;
00146 }
00147
00148 template<class T> inline void Swap(T &a, T &b){
00149 T tmp=a; a=b; b=tmp;
00150 }
00151 template<class T> inline void Sort(T &a, T &b){
00152 if (a>b) Swap(a,b);
00153 }
00154 template<class T> inline void Sort(T &a, T &b, T &c){
00155 if (a>b) Swap(a,b);
00156 if (b>c) {Swap(b,c); if (a>b) Swap(a,b);}
00157 }
00158
00159
00160 #ifndef M_PI
00161 #define M_PI 3.14159265358979323846
00162 #endif
00163
00164 #ifndef SQRT_TWO
00165 #define SQRT_TWO 1.4142135623730950488
00166 #endif
00167
00168 template <class SCALAR>
00169 inline SCALAR Clamp( const SCALAR & val, const SCALAR& minval, const SCALAR& maxval)
00170 {
00171 if(val < minval) return minval;
00172 if(val > maxval) return maxval;
00173 return val;
00174 }
00175
00176
00177
00178 inline float ToDeg(const float &a){return a*180.0f/float(M_PI);}
00179 inline float ToRad(const float &a){return float(M_PI)*a/180.0f;}
00180 inline double ToDeg(const double &a){return a*180.0/M_PI;}
00181 inline double ToRad(const double &a){return M_PI*a/180.0;}
00182
00183 #if defined(_MSC_VER) // Microsoft Visual C++
00184 template<class T> int IsNAN(T t) { return _isnan(t); }
00185 #elif defined(__GNUC__) // GCC
00186 template<class T> int IsNAN(T t) { return isnan(t); }
00187 #else // generic
00188
00189 template<class T> int IsNAN(T t)
00190 {
00191 if(std::numeric_limits<T>::has_infinity)
00192 return !(t <= std::numeric_limits<T>::infinity());
00193 else
00194 return t != t;
00195 }
00196
00197 #endif
00198 }
00199
00201 class VoidType{ public:
00202 VoidType(){};
00203 };
00204
00205 }
00206
00207
00208 #endif