mathlib.h
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:2k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // mathlib.h
  2. // 
  3. // Copyright (C) 2001-2008, Chris Laurel <claurel@shatters.net>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #ifndef _CELMATH_MATHLIB_H_
  10. #define _CELMATH_MATHLIB_H_
  11. #include <cmath>
  12. #include <stdlib.h>
  13. #define PI 3.14159265358979323846
  14. template<class T> class Math
  15. {
  16. public:
  17.     static inline void sincos(T, T&, T&);
  18.     static inline T frand();
  19.     static inline T sfrand();
  20.     static inline T lerp(T t, T a, T b);
  21.     static inline T clamp(T t);
  22. private:
  23.     // This class is static and should not be instantiated
  24.     Math() {};
  25. };
  26. typedef Math<float> Mathf;
  27. typedef Math<double> Mathd;
  28. template<class T> T degToRad(T d)
  29. {
  30.     return d / 180 * static_cast<T>(PI);
  31. }
  32. template<class T> T radToDeg(T r)
  33. {
  34.     return r * 180 / static_cast<T>(PI);
  35. }
  36. template<class T> T abs(T x)
  37. {
  38.     return (x < 0) ? -x : x;
  39. }
  40. template<class T> T square(T x)
  41. {
  42.     return x * x;
  43. }
  44. template<class T> T cube(T x)
  45. {
  46.     return x * x * x;
  47. }
  48. template<class T> T clamp(T x)
  49. {
  50.     if (x < 0)
  51.         return 0;
  52.     else if (x > 1)
  53.         return 1;
  54.     else
  55.         return x;
  56. }
  57. template<class T> T sign(T x)
  58. {
  59.     if (x < 0)
  60.         return -1;
  61.     else if (x > 0)
  62.         return 1;
  63.     else
  64.         return 0;
  65. }
  66. // This function is like fmod except that it always returns
  67. // a positive value in the range [ 0, y )
  68. template<class T> T pfmod(T x, T y)
  69. {
  70.     T quotient = std::floor(std::abs(x / y));
  71.     if (x < 0.0)
  72.         return x + (quotient + 1) * y;
  73.     else
  74.         return x - quotient * y;
  75. }
  76. template<class T> T circleArea(T r)
  77. {
  78.     return (T) PI * r * r;
  79. }
  80. template<class T> T sphereArea(T r)
  81. {
  82.     return 4 * (T) PI * r * r;
  83. }
  84. template<class T> void Math<T>::sincos(T angle, T& s, T& c)
  85. {
  86.     s = (T) sin(angle);
  87.     c = (T) cos(angle);
  88. }
  89. // return a random float in [0, 1]
  90. template<class T> T Math<T>::frand()
  91. {
  92.     return (T) (rand() & 0x7fff) / (T) 32767;
  93. }
  94. // return a random float in [-1, 1]
  95. template<class T> T Math<T>::sfrand()
  96. {
  97.     return (T) (rand() & 0x7fff) / (T) 32767 * 2 - 1;
  98. }
  99. template<class T> T Math<T>::lerp(T t, T a, T b)
  100. {
  101.     return a + t * (b - a);
  102. }
  103. // return t clamped to [0, 1]
  104. template<class T> T Math<T>::clamp(T t)
  105. {
  106.     if (t < 0)
  107.         return 0;
  108.     else if (t > 1)
  109.         return 1;
  110.     else
  111.         return t;
  112. }
  113. #endif // _MATHLIB_H_