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 #ifndef _BASE_MATH_
00026 #define _BASE_MATH_
00027
00028 #include <base/base>
00029 #include <base/consts>
00030
00031 #include <base/Object>
00032 #include <base/Vector>
00033 #include <base/Matrix>
00034
00035
00036 namespace base {
00037
00038
00039
00040
00041
00042
00043
00044
00045 class Math : public Object
00046 {
00047 public:
00048 virtual String className() const { return String("Math"); }
00049
00050
00051 inline static Real degToRad(Real d) { return (d*consts::TwoPi)/360.0; }
00052
00053 inline static Real radToDeg(Real r) { return (r*360.0)/consts::TwoPi; }
00054
00055
00056 inline static Real sqr(Real n) { return n*n; }
00057
00058 inline static Real sqrt(Real n) { Assert(n>=0); return ::sqrt(n); }
00059
00060 inline static Real cube(Real n) { return n*n*n; }
00061
00062 inline static Real abs(Real s) { return fabs(s); }
00063
00064 inline static Real sign(Real n) { return (n<0)?-1:((n>0)?1:0); }
00065
00066 inline static Real pow(Real x, Real y) { return ::pow(x,y); }
00067
00068 inline static Real random()
00069 { return Real(::random())/Real(2147483648U-1); }
00070
00071
00072 inline static bool isNAN(Real n)
00073 { return isnan(n); }
00074
00075
00076 inline static Real sin(Real a) { return ::sin(a); }
00077 inline static Real cos(Real a) { return ::cos(a); }
00078 inline static Real tan(Real a) { return ::tan(a); }
00079 inline static Real asin(Real a) { return ::asin(a); }
00080 inline static Real acos(Real a) { return ::acos(a); }
00081 inline static Real atan(Real a) { return ::atan(a); }
00082 inline static Real atan2(Real a, Real b) { return ::atan2(a,b); }
00083
00084
00085
00086 inline static bool equals(const Real r1, const Real r2, Real eps = consts::epsilon)
00087 { return ::fabs(r1-r2) < eps; }
00088
00089
00090 inline static Real zeroIfNeighbour(Real n, Real neighbourhoodRadius = consts::epsilon)
00091 { return (::fabs(n) < neighbourhoodRadius)?0:n; }
00092
00093
00094
00095 template<typename T> static inline T minimum(const T& t1, const T& t2) { return (t1<t2)?t1:t2; }
00096
00097 template<typename T> static inline T minimum(const T& t1, const T& t2, const T& t3) { return (t1<t2)?((t1<t3)?t1:t3):((t2<t3)?t2:t3); }
00098
00099 template<typename T> static inline T maximum(const T& t1, const T& t2) { return (t1>t2)?t1:t2; }
00100
00101 template<typename T> static inline T maximum(const T& t1, const T& t2, const T& t3) { return (t1>t2)?((t1>t3)?t1:t3):((t2>t3)?t2:t3); }
00102
00103
00104
00105 template<typename T> static void bound(T& v, const T& lower, const T& upper)
00106 { if (v<lower) v=lower; else { if (v>upper) v=upper; } }
00107
00108
00109
00110 static inline Real normalizeAngle(Real angle)
00111 {
00112 while (angle > consts::Pi) angle-=consts::TwoPi;
00113 while (angle <= -consts::Pi) angle+=consts::TwoPi;
00114 return angle;
00115 }
00116
00117
00118 static inline Real normalizeAngle2PI(Real angle)
00119 {
00120 while (angle >= consts::TwoPi) angle-=consts::TwoPi;
00121 while (angle < 0) angle+=consts::TwoPi;
00122 return angle;
00123 }
00124
00125
00126
00127 static Real angleDifference(Real angle1, Real angle2);
00128
00129
00130
00131
00132
00133
00134 static void decomposeLUP(const Matrix& A, Matrix& L, Matrix& U, Vector& Pi, Real epsilon = consts::epsilon2);
00135
00136
00137 static Vector solveLUP(const Matrix& L, const Matrix& U, const Vector& Pi, const Vector& b);
00138
00139
00140
00141 static Matrix inverse(const Matrix& A, Real epsilon = consts::epsilon2);
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 static Matrix nullSpace(const Matrix& A, Int& nullSpaceRank, Real& k2);
00152
00153
00154
00155 static Matrix pseudoInverse(const Matrix& A);
00156
00157
00158
00159
00160 protected:
00161
00162 Math() {}
00163 Math(const Math&) {}
00164 virtual ~Math() {}
00165 };
00166
00167
00168 }
00169
00170 #endif