Changeset 2111 for code/branches/objecthierarchy/src/util/Math.h
- Timestamp:
- Nov 2, 2008, 12:38:26 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/objecthierarchy/src/util/Math.h
r2019 r2111 49 49 #include <OgreQuaternion.h> 50 50 #include <OgreColourValue.h> 51 52 namespace orxonox53 {54 typedef Ogre::Radian Radian;55 typedef Ogre::Degree Degree;56 typedef Ogre::Vector2 Vector2;57 typedef Ogre::Vector3 Vector3;58 typedef Ogre::Vector4 Vector4;59 typedef Ogre::Matrix3 Matrix3;60 typedef Ogre::Matrix4 Matrix4;61 typedef Ogre::Quaternion Quaternion;62 typedef Ogre::ColourValue ColourValue;63 }64 65 _UtilExport std::ostream& operator<<(std::ostream& out, const orxonox::Radian& radian);66 _UtilExport std::istream& operator>>(std::istream& in, orxonox::Radian& radian);67 _UtilExport std::ostream& operator<<(std::ostream& out, const orxonox::Degree& degree);68 _UtilExport std::istream& operator>>(std::istream& in, orxonox::Degree& degree);69 70 _UtilExport float getAngle(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& otherposition);71 _UtilExport orxonox::Vector2 get2DViewdirection(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition);72 _UtilExport orxonox::Vector2 get2DViewcoordinates(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition);73 _UtilExport orxonox::Vector3 getPredictedPosition(const orxonox::Vector3& myposition, float projectilespeed, const orxonox::Vector3& targetposition, const orxonox::Vector3& targetvelocity);74 51 75 52 //Get around Windows hackery … … 83 60 #endif 84 61 85 /** 86 @brief Returns the sign of the given value. 87 @param x The value 88 @return 1 if the value is positive or zero, -1 if the value is negative 89 */ 90 template <typename T> 91 inline T sgn(T x) 62 namespace orxonox 92 63 { 93 return (x >= 0) ? 1 : -1; 64 typedef Ogre::Radian Radian; 65 typedef Ogre::Degree Degree; 66 typedef Ogre::Vector2 Vector2; 67 typedef Ogre::Vector3 Vector3; 68 typedef Ogre::Vector4 Vector4; 69 typedef Ogre::Matrix3 Matrix3; 70 typedef Ogre::Matrix4 Matrix4; 71 typedef Ogre::Quaternion Quaternion; 72 typedef Ogre::ColourValue ColourValue; 73 74 _UtilExport std::ostream& operator<<(std::ostream& out, const orxonox::Radian& radian); 75 _UtilExport std::istream& operator>>(std::istream& in, orxonox::Radian& radian); 76 _UtilExport std::ostream& operator<<(std::ostream& out, const orxonox::Degree& degree); 77 _UtilExport std::istream& operator>>(std::istream& in, orxonox::Degree& degree); 78 79 _UtilExport float getAngle(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& otherposition); 80 _UtilExport orxonox::Vector2 get2DViewdirection(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition); 81 _UtilExport orxonox::Vector2 get2DViewcoordinates(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition); 82 _UtilExport orxonox::Vector3 getPredictedPosition(const orxonox::Vector3& myposition, float projectilespeed, const orxonox::Vector3& targetposition, const orxonox::Vector3& targetvelocity); 83 84 /** 85 @brief Returns the sign of the given value. 86 @param x The value 87 @return 1 if the value is positive or zero, -1 if the value is negative 88 */ 89 template <typename T> 90 inline T sgn(T x) 91 { 92 return (x >= 0) ? 1 : -1; 93 } 94 95 /** 96 @brief Returns the smaller of two values. 97 */ 98 template <typename T> 99 inline T min(T a, T b) 100 { 101 return (a <= b) ? a : b; 102 } 103 104 /** 105 @brief Returns the greater of two values. 106 */ 107 template <typename T> 108 inline T max(T a, T b) 109 { 110 return (a >= b) ? a : b; 111 } 112 113 /** 114 @brief Keeps a value between a lower and an upper limit. 115 @param x The value 116 @param min The lower limit 117 @param max The upper limit 118 */ 119 template <typename T> 120 inline T clamp(T x, T min, T max) 121 { 122 if (x < min) 123 return min; 124 125 if (x > max) 126 return max; 127 128 return x; 129 } 130 131 /** 132 @brief Returns the square value (x^2). 133 */ 134 template <typename T> 135 inline T square(T x) 136 { 137 return x*x; 138 } 139 140 /** 141 @brief Returns the cube value (x^3). 142 */ 143 template <typename T> 144 inline T cube(T x) 145 { 146 return x*x*x; 147 } 148 149 /** 150 @brief Rounds the value down. 151 */ 152 template <typename T> 153 inline int floor(T x) 154 { 155 return (int)(x); 156 } 157 158 /** 159 @brief Rounds the value up. 160 */ 161 template <typename T> 162 inline int ceil(T x) 163 { 164 int temp = floor(x); 165 return (temp != x) ? (temp + 1) : temp; 166 } 167 168 /** 169 @brief Rounds the value. 170 */ 171 template <typename T> 172 inline int round(T x) 173 { 174 return (int)(x + 0.5); 175 } 176 177 /** 178 @brief The modulo operation, enhanced to work properly with negative values. 179 @param x The value 180 @param max The operand 181 */ 182 template <typename T> 183 inline int mod(T x, int max) 184 { 185 if (x >= 0) 186 return (x % max); 187 else 188 return ((x % max) + max); 189 } 190 191 template <typename T> 192 inline T zeroise() 193 { 194 BOOST_STATIC_ASSERT(sizeof(T) == 0); 195 return T(); 196 } 197 198 template <> inline char zeroise<char>() { return 0; } 199 template <> inline unsigned char zeroise<unsigned char>() { return 0; } 200 template <> inline short zeroise<short>() { return 0; } 201 template <> inline unsigned short zeroise<unsigned short>() { return 0; } 202 template <> inline int zeroise<int>() { return 0; } 203 template <> inline unsigned int zeroise<unsigned int>() { return 0; } 204 template <> inline long zeroise<long>() { return 0; } 205 template <> inline unsigned long zeroise<unsigned long>() { return 0; } 206 template <> inline long long zeroise<long long>() { return 0; } 207 template <> inline unsigned long long zeroise<unsigned long long>() { return 0; } 208 template <> inline float zeroise<float>() { return 0; } 209 template <> inline double zeroise<double>() { return 0; } 210 template <> inline long double zeroise<long double>() { return 0; } 211 template <> inline bool zeroise<bool>() { return 0; } 212 template <> inline void* zeroise<void*>() { return 0; } 213 template <> inline std::string zeroise<std::string>() { return ""; } 214 template <> inline orxonox::Radian zeroise<orxonox::Radian>() { return orxonox::Radian(0.0f); } 215 template <> inline orxonox::Degree zeroise<orxonox::Degree>() { return orxonox::Degree(0.0f); } 216 template <> inline orxonox::Vector2 zeroise<orxonox::Vector2>() { return orxonox::Vector2 (0, 0) ; } 217 template <> inline orxonox::Vector3 zeroise<orxonox::Vector3>() { return orxonox::Vector3 (0, 0, 0) ; } 218 template <> inline orxonox::Vector4 zeroise<orxonox::Vector4>() { return orxonox::Vector4 (0, 0, 0, 0); } 219 template <> inline orxonox::ColourValue zeroise<orxonox::ColourValue>() { return orxonox::ColourValue(0, 0, 0, 0); } 220 template <> inline orxonox::Quaternion zeroise<orxonox::Quaternion>() { return orxonox::Quaternion (0, 0, 0, 0); } 221 222 /** 223 @brief Interpolates between two values for a time between 0 and 1. 224 @param time The time is a value between 0 and 1 - the function returns start if time is 0 and end if time is 1 and interpolates if time is between 0 and 1. 225 @param start The value at time = 0 226 @param end The value at time = 1 227 @return The interpolation at a given time 228 */ 229 template <typename T> 230 T interpolate(float time, const T& start, const T& end) 231 { 232 return time * (end - start) + start; 233 } 234 235 /** 236 @brief Interpolates smoothly between two values for a time between 0 and 1. The function starts slowly, increases faster and stops slowly again. 237 @param time The time is a value between 0 and 1 - the function returns start if time is 0 and end if time is 1 and interpolates if time is between 0 and 1. 238 @param start The value at time = 0 239 @param end The value at time = 1 240 @return The smoothed interpolation at a given time 241 */ 242 template <typename T> 243 T interpolateSmooth(float time, const T& start, const T& end) 244 { 245 return (-2 * (end - start) * cube(time)) + (3 * (end - start) * square(time)) + start; 246 } 247 248 /** 249 @brief Returns a random number between 0 and almost 1: 0 <= rnd < 1. 250 */ 251 inline float rnd() 252 { 253 return rand() / (RAND_MAX + 1.0); 254 } 255 256 /** 257 @brief Returns a random number between 0 and almost max: 0 <= rnd < max. 258 @param max The maximum 259 */ 260 inline float rnd(float max) 261 { 262 return rnd() * max; 263 } 264 265 /** 266 @brief Returns a random number between min and almost max: min <= rnd < max. 267 @param min The minimum 268 @param max The maximum 269 */ 270 inline float rnd(float min, float max) 271 { 272 return rnd(max - min) + min; 273 } 274 275 _UtilExport unsigned long getUniqueNumber(); 276 277 class IntVector2 278 { 279 public: 280 IntVector2() : x(0), y(0) { } 281 IntVector2(int _x, int _y) : x(_x), y(_y) { } 282 int x; 283 int y; 284 }; 285 286 class IntVector3 287 { 288 public: 289 IntVector3() : x(0), y(0), z(0) { } 290 IntVector3(int _x, int _y, int _z) : x(_x), y(_y), z(_z) { } 291 int x; 292 int y; 293 int z; 294 }; 94 295 } 95 296 96 /**97 @brief Returns the smaller of two values.98 */99 template <typename T>100 inline T min(T a, T b)101 {102 return (a <= b) ? a : b;103 }104 105 /**106 @brief Returns the greater of two values.107 */108 template <typename T>109 inline T max(T a, T b)110 {111 return (a >= b) ? a : b;112 }113 114 /**115 @brief Keeps a value between a lower and an upper limit.116 @param x The value117 @param min The lower limit118 @param max The upper limit119 */120 template <typename T>121 inline T clamp(T x, T min, T max)122 {123 if (x < min)124 return min;125 126 if (x > max)127 return max;128 129 return x;130 }131 132 /**133 @brief Returns the square value (x^2).134 */135 template <typename T>136 inline T square(T x)137 {138 return x*x;139 }140 141 /**142 @brief Returns the cube value (x^3).143 */144 template <typename T>145 inline T cube(T x)146 {147 return x*x*x;148 }149 150 /**151 @brief Rounds the value down.152 */153 template <typename T>154 inline int floor(T x)155 {156 return (int)(x);157 }158 159 /**160 @brief Rounds the value up.161 */162 template <typename T>163 inline int ceil(T x)164 {165 int temp = floor(x);166 return (temp != x) ? (temp + 1) : temp;167 }168 169 /**170 @brief Rounds the value.171 */172 template <typename T>173 inline int round(T x)174 {175 return (int)(x + 0.5);176 }177 178 /**179 @brief The modulo operation, enhanced to work properly with negative values.180 @param x The value181 @param max The operand182 */183 template <typename T>184 inline int mod(T x, int max)185 {186 if (x >= 0)187 return (x % max);188 else189 return ((x % max) + max);190 }191 192 template <typename T>193 inline T zeroise()194 {195 BOOST_STATIC_ASSERT(sizeof(T) == 0);196 return T();197 }198 199 template <> inline char zeroise<char>() { return 0; }200 template <> inline unsigned char zeroise<unsigned char>() { return 0; }201 template <> inline short zeroise<short>() { return 0; }202 template <> inline unsigned short zeroise<unsigned short>() { return 0; }203 template <> inline int zeroise<int>() { return 0; }204 template <> inline unsigned int zeroise<unsigned int>() { return 0; }205 template <> inline long zeroise<long>() { return 0; }206 template <> inline unsigned long zeroise<unsigned long>() { return 0; }207 template <> inline long long zeroise<long long>() { return 0; }208 template <> inline unsigned long long zeroise<unsigned long long>() { return 0; }209 template <> inline float zeroise<float>() { return 0; }210 template <> inline double zeroise<double>() { return 0; }211 template <> inline long double zeroise<long double>() { return 0; }212 template <> inline bool zeroise<bool>() { return 0; }213 template <> inline void* zeroise<void*>() { return 0; }214 template <> inline std::string zeroise<std::string>() { return ""; }215 template <> inline orxonox::Radian zeroise<orxonox::Radian>() { return orxonox::Radian(0.0f); }216 template <> inline orxonox::Degree zeroise<orxonox::Degree>() { return orxonox::Degree(0.0f); }217 template <> inline orxonox::Vector2 zeroise<orxonox::Vector2>() { return orxonox::Vector2 (0, 0) ; }218 template <> inline orxonox::Vector3 zeroise<orxonox::Vector3>() { return orxonox::Vector3 (0, 0, 0) ; }219 template <> inline orxonox::Vector4 zeroise<orxonox::Vector4>() { return orxonox::Vector4 (0, 0, 0, 0); }220 template <> inline orxonox::ColourValue zeroise<orxonox::ColourValue>() { return orxonox::ColourValue(0, 0, 0, 0); }221 template <> inline orxonox::Quaternion zeroise<orxonox::Quaternion>() { return orxonox::Quaternion (0, 0, 0, 0); }222 223 /**224 @brief Interpolates between two values for a time between 0 and 1.225 @param time The time is a value between 0 and 1 - the function returns start if time is 0 and end if time is 1 and interpolates if time is between 0 and 1.226 @param start The value at time = 0227 @param end The value at time = 1228 @return The interpolation at a given time229 */230 template <typename T>231 T interpolate(float time, const T& start, const T& end)232 {233 return time * (end - start) + start;234 }235 236 /**237 @brief Interpolates smoothly between two values for a time between 0 and 1. The function starts slowly, increases faster and stops slowly again.238 @param time The time is a value between 0 and 1 - the function returns start if time is 0 and end if time is 1 and interpolates if time is between 0 and 1.239 @param start The value at time = 0240 @param end The value at time = 1241 @return The smoothed interpolation at a given time242 */243 template <typename T>244 T interpolateSmooth(float time, const T& start, const T& end)245 {246 return (-2 * (end - start) * cube(time)) + (3 * (end - start) * square(time)) + start;247 }248 249 /**250 @brief Returns a random number between 0 and almost 1: 0 <= rnd < 1.251 */252 inline _UtilExport float rnd()253 {254 return rand() / (RAND_MAX + 1.0);255 }256 257 /**258 @brief Returns a random number between 0 and almost max: 0 <= rnd < max.259 @param max The maximum260 */261 inline _UtilExport float rnd(float max)262 {263 return rnd() * max;264 }265 266 /**267 @brief Returns a random number between min and almost max: min <= rnd < max.268 @param min The minimum269 @param max The maximum270 */271 inline _UtilExport float rnd(float min, float max)272 {273 return rnd(max - min) + min;274 }275 276 _UtilExport unsigned long getUniqueNumber();277 278 class _UtilExport IntVector2279 {280 public:281 IntVector2() : x(0), y(0) { }282 IntVector2(int _x, int _y) : x(_x), y(_y) { }283 int x;284 int y;285 };286 287 class _UtilExport IntVector3288 {289 public:290 IntVector3() : x(0), y(0), z(0) { }291 IntVector3(int _x, int _y, int _z) : x(_x), y(_y), z(_z) { }292 int x;293 int y;294 int z;295 };296 297 297 #endif /* _Util_Math_H__ */
Note: See TracChangeset
for help on using the changeset viewer.