FrameworkMath.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #ifndef FrameworkMath_H
  2. #define FrameworkMath_H
  3. #include <functional>
  4. #include <math.h>
  5. #include "Betriebssystem.h"
  6. namespace Framework
  7. {
  8. #define PI 3.14159265
  9. //! Gibt die größere Zahl zurück ohne if zu verwenden
  10. //! Funktioniert nur, wenn die Zahlen nicht mehr als 16 bits verwenden
  11. //! \param a Eine der beiden Zahlen
  12. //! \param b Eine der beiden Zahlen
  13. inline int maxInt(int a, int b)
  14. {
  15. return (((a - b) >> 16) & b) | (~((a - b) >> 16) & a);
  16. }
  17. //! Gibt die kleinere Zahl zurück ohne if zu verwenden
  18. //! Funktioniert nur, wenn die Zahlen nicht mehr als 16 bits verwenden
  19. //! \param a Eine der beiden Zahlen
  20. //! \param b Eine der beiden Zahlen
  21. inline int minInt(int a, int b)
  22. {
  23. return (((a - b) >> 16) & a) | (~((a - b) >> 16) & b);
  24. }
  25. //! Gibt den positiven Wert eines Zeichnunges zurück.
  26. //! Klappt nur, wenn der - und der < 0 operator definiert ist
  27. template<typename T> inline T abs(T t)
  28. {
  29. if (t < 0) return -t;
  30. return t;
  31. }
  32. inline float lowPrecisionSin(float radiant)
  33. {
  34. while (radiant < -3.14159265f)
  35. radiant += 6.28318531f;
  36. while (radiant > 3.14159265f)
  37. radiant -= 6.28318531f;
  38. float sin = 0;
  39. if (radiant < 0)
  40. {
  41. sin = 1.27323954f * radiant + .405284735f * radiant * radiant;
  42. if (sin < 0)
  43. sin = .225f * (sin * -sin - sin) + sin;
  44. else
  45. sin = .225f * (sin * sin - sin) + sin;
  46. }
  47. else
  48. {
  49. sin = 1.27323954f * radiant - 0.405284735f * radiant * radiant;
  50. if (sin < 0)
  51. sin = .225f * (sin * -sin - sin) + sin;
  52. else
  53. sin = .225f * (sin * sin - sin) + sin;
  54. }
  55. return sin;
  56. }
  57. inline float lowPrecisionCos(float radiant)
  58. {
  59. return lowPrecisionSin(radiant + 3.14159265f / 2.f);
  60. }
  61. inline float lowPrecisionTan(float radiant)
  62. {
  63. return lowPrecisionSin(radiant) / lowPrecisionCos(radiant);
  64. }
  65. inline float lowPrecisionACos(float cos)
  66. {
  67. float negate = float(cos < 0);
  68. cos = abs(cos);
  69. float ret = -0.0187293f;
  70. ret = ret * cos;
  71. ret = ret + 0.0742610f;
  72. ret = ret * cos;
  73. ret = ret - 0.2121144f;
  74. ret = ret * cos;
  75. ret = ret + 1.5707288f;
  76. ret = ret * (float)sqrt(1.0 - cos);
  77. ret = ret - 2 * negate * ret;
  78. return negate * 3.14159265358979f + ret;
  79. }
  80. inline float lowPrecisionASin(float sin)
  81. {
  82. return 3.14159265358979f / 2.f - lowPrecisionACos(sin);
  83. }
  84. } // namespace Framework
  85. #endif