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 #ifndef __OPENKN_MATH__MATHTOOLS_HPP__
00028 #define __OPENKN_MATH__MATHTOOLS_HPP__
00029
00030 namespace kn{
00031
00035 static const double PI = 3.14159265358979323846;
00036
00040 static const double TWO_PI = 6.28318530717958647692;
00041
00045 static const double PI_TWO = 1.57079632679489661923;
00046
00050 static const double PI_FOUR = 0.78539816339744830962;
00051
00055 static const double DEG2RAD = 0.01745329251994329576;
00056
00060 static const double RAD2DEG = 57.2957795130823208767;
00061
00065 static const double GOLDEN_NUMBER = 1.61803398874989484820;
00066
00072 static double degToRad(const double& deg) { return deg*DEG2RAD; }
00073
00079 static double radToDeg(const double& rad) { return rad*RAD2DEG; }
00080
00081
00089 static double pythag(const double &a, const double &b) {
00090 double absa,absb;
00091
00092 absa = std::fabs(a);
00093 absb = std::fabs(b);
00094
00095 if(absa > absb) return absa*std::sqrt(1.0+(absb/absa)*(absb/absa));
00096 else return (absb == 0.0 ? 0.0 :absb*std::sqrt(1.0+(absa/absb)*(absa/absb)));
00097 }
00098
00105 template<class T> static T setSign(const T& a, const T& b){
00106 return b>=T(0)?T(std::fabs(a)):-T(std::fabs(a));
00107 }
00108
00114 template<class T> static T getSign(const T& a){
00115 if(a==T(0))return a;
00116 return a>T(0)?T(1):T(-1);
00117 }
00118
00124 static inline bool isPowerOfTwo(const unsigned int& n){
00125 return (n & (n - 1)) == 0 && n > 0;
00126 }
00127
00128
00134 static inline unsigned int ceilPowerOfTwo(const unsigned int& n)
00135 {
00136 int tmpn = n;
00137 --tmpn;
00138 tmpn |= tmpn >> 1;
00139 tmpn |= tmpn >> 2;
00140 tmpn |= tmpn >> 4;
00141 tmpn |= tmpn >> 8;
00142 tmpn |= tmpn >> 16;
00143 ++tmpn;
00144 return tmpn;
00145 }
00146
00152 static inline unsigned int floorPowerOfTwo(const unsigned int& n){
00153 return ceilPowerOfTwo(n) >> 1;
00154 }
00155 }
00156
00157 #endif