Go to the documentation of this file.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 <float.h>
00090 #include <math.h>
00091 #include <assert.h>
00092 #include <limits>
00093 #include <algorithm>
00094
00095
00096 #ifdef __BORLANDC__
00097 float sqrtf (float v) {return sqrt(v);}
00098 float fabsf (float v) {return fabs(v);}
00099 float cosf (float v) {return cos(v);}
00100 float sinf (float v) {return sin(v);}
00101 float acosf (float v) {return acos(v);}
00102 float asinf (float v) {return asin(v);}
00103 float atan2f (float v0, float v1) {return atan2(v0,v1);}
00104 #endif
00105
00106 namespace vcg {
00107
00108 namespace math {
00109
00110 template <class SCALAR>
00111 class MagnitudoComparer
00112 {
00113 public:
00114 inline bool operator() ( const SCALAR a, const SCALAR b ) { return fabs(a)>fabs(b); }
00115 };
00116
00117 inline float Sqrt(const short v) { return sqrtf(v); }
00118 inline float Sqrt(const int v) { return sqrtf((float)v); }
00119
00120 inline float Sqrt(const float v) { return sqrtf(v); }
00121 inline float Abs(const float v) { return fabsf(v); }
00122 inline float Cos(const float v) { return cosf(v); }
00123 inline float Sin(const float v) { return sinf(v); }
00124 inline float Acos(const float v) { return acosf(v); }
00125 inline float Asin(const float v) { return asinf(v); }
00126 inline float Atan2(const float v0,const float v1) { return atan2f(v0,v1); }
00127
00128 inline double Sqrt(const double v) { return sqrt(v); }
00129 inline double Abs(const double v) { return fabs(v); }
00130 inline double Cos(const double v) { return cos(v); }
00131 inline double Sin(const double v) { return sin(v); }
00132 inline double Acos(const double v) { return acos(v); }
00133 inline double Asin(const double v) { return asin(v); }
00134 inline double Atan2(const double v0,const double v1) { return atan2(v0,v1); }
00135
00136 template <typename T> inline static T Sqr(T a) { return a*a; }
00137
00138 template<class T> inline const T & Min(const T &a, const T &b,const T &c){
00139 if (a<b) {
00140 if(a<c) return a;
00141 else return c;
00142 } else {
00143 if(b<c) return b;
00144 else return c;
00145 }
00146 }
00147 template<class T> inline const T & Max(const T &a, const T &b, const T &c){
00148 if (a>b) {
00149 if(a>c) return a;
00150 else return c;
00151 } else {
00152 if(b>c) return b;
00153 else return c;
00154 }
00155 }
00156
00157 template<class T> inline void Sort(T &a, T &b){
00158 if (a>b) std::swap(a,b);
00159 }
00160 template<class T> inline void Sort(T &a, T &b, T &c){
00161 if (a>b) std::swap(a,b);
00162 if (b>c) {std::swap(b,c); if (a>b) std::swap(a,b);}
00163 }
00164
00165
00166 #ifndef M_PI
00167 #define M_PI 3.14159265358979323846
00168 #endif
00169
00170 #ifndef SQRT_TWO
00171 #define SQRT_TWO 1.4142135623730950488
00172 #endif
00173
00174 template <class SCALAR>
00175 inline SCALAR Clamp( const SCALAR & val, const SCALAR& minval, const SCALAR& maxval)
00176 {
00177 if(val < minval) return minval;
00178 if(val > maxval) return maxval;
00179 return val;
00180 }
00181
00182
00183
00184 inline float ToDeg(const float &a){return a*180.0f/float(M_PI);}
00185 inline float ToRad(const float &a){return float(M_PI)*a/180.0f;}
00186 inline double ToDeg(const double &a){return a*180.0/M_PI;}
00187 inline double ToRad(const double &a){return M_PI*a/180.0;}
00188
00189 template <typename T>
00190 int Sgn(T val) {
00191 return (T(0) < val) - (val < T(0));
00192 }
00193
00194 #if defined(_MSC_VER) // Microsoft Visual C++
00195 template<class T> int IsNAN(T t) { return _isnan(t) || (!_finite(t)); }
00196 #elif defined(__MINGW32__) // GCC
00197 template<class T> int IsNAN(T t) { return std::isnan(t) || std::isinf(t); }
00198 #elif defined(__GNUC__) // GCC
00199 template<class T> int IsNAN(T t) { return isnan(t) || isinf(t); }
00200 #else // generic
00201
00202 template<class T> int IsNAN(T t)
00203 {
00204 if(std::numeric_limits<T>::has_infinity)
00205 return !(t <= std::numeric_limits<T>::infinity());
00206 else
00207 return t != t;
00208 }
00209
00210 #endif
00211 }
00212
00214 class VoidType{ public:
00215 VoidType(){};
00216 };
00217
00218 }
00219
00220
00221 #endif