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 #ifndef MATHDEFS_HH
00027 #define MATHDEFS_HH
00028
00029 #include <math.h>
00030 #include <float.h>
00031
00032 #ifndef M_PI
00033 #define M_PI 3.14159265359
00034 #endif
00035
00036 namespace OpenMesh
00037 {
00038
00041 template <class T, typename Real>
00042 inline bool is_zero(const T& _a, Real _eps)
00043 { return fabs(_a) < _eps; }
00044
00045 template <class T1, class T2, typename Real>
00046 inline bool is_eq(const T1& a, const T2& b, Real _eps)
00047 { return is_zero(a-b, _eps); }
00048
00049 template <class T1, class T2, typename Real>
00050 inline bool is_gt(const T1& a, const T2& b, Real _eps)
00051 { return (a > b) && !is_eq(a,b,_eps); }
00052
00053 template <class T1, class T2, typename Real>
00054 inline bool is_ge(const T1& a, const T2& b, Real _eps)
00055 { return (a > b) || is_eq(a,b,_eps); }
00056
00057 template <class T1, class T2, typename Real>
00058 inline bool is_lt(const T1& a, const T2& b, Real _eps)
00059 { return (a < b) && !is_eq(a,b,_eps); }
00060
00061 template <class T1, class T2, typename Real>
00062 inline bool is_le(const T1& a, const T2& b, Real _eps)
00063 { return (a < b) || is_eq(a,b,_eps); }
00064
00065
00066
00067 const float flt_eps__ = (float)1e-05;
00068 const double dbl_eps__ = 1e-09;
00069
00070 inline float eps__(float)
00071 { return flt_eps__; }
00072
00073 inline double eps__(double)
00074 { return dbl_eps__; }
00075
00076 template <class T>
00077 inline bool is_zero(const T& a)
00078 { return is_zero(a, eps__(a)); }
00079
00080 template <class T1, class T2>
00081 inline bool is_eq(const T1& a, const T2& b)
00082 { return is_zero(a-b); }
00083
00084 template <class T1, class T2>
00085 inline bool is_gt(const T1& a, const T2& b)
00086 { return (a > b) && !is_eq(a,b); }
00087
00088 template <class T1, class T2>
00089 inline bool is_ge(const T1& a, const T2& b)
00090 { return (a > b) || is_eq(a,b); }
00091
00092 template <class T1, class T2>
00093 inline bool is_lt(const T1& a, const T2& b)
00094 { return (a < b) && !is_eq(a,b); }
00095
00096 template <class T1, class T2>
00097 inline bool is_le(const T1& a, const T2& b)
00098 { return (a < b) || is_eq(a,b); }
00099
00101
00102 template <class T>
00103 inline T sane_aarg(T _aarg)
00104 {
00105 if (_aarg < -1)
00106 {
00107 _aarg = -1;
00108 }
00109 else if (_aarg > 1)
00110 {
00111 _aarg = 1;
00112 }
00113 return _aarg;
00114 }
00115
00120 template <class T>
00121 T angle(T _cos_angle, T _sin_angle)
00122 {
00123 _cos_angle = sane_aarg(_cos_angle);
00124 return (T) _sin_angle >= 0 ? acos(_cos_angle) : -acos(_cos_angle);
00125 }
00126
00127 template <class T>
00128 inline T positive_angle(T _angle)
00129 { return _angle < 0 ? (2*M_PI + _angle) : _angle; }
00130
00131 template <class T>
00132 inline T positive_angle(T _cos_angle, T _sin_angle)
00133 { return positive_angle(angle(_cos_angle, _sin_angle)); }
00134
00135 template <class T>
00136 inline T deg_to_rad(const T& _angle)
00137 { return M_PI*(_angle/180); }
00138
00139 template <class T>
00140 inline T rad_to_deg(const T& _angle)
00141 { return 180*(_angle/M_PI); }
00142
00143 };
00144
00145 #endif//MATHDEFS_HH