FrameworkMath.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #ifndef FrameworkMath_H
  2. #define FrameworkMath_H
  3. #include <math.h>
  4. #include <functional>
  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>
  28. inline T abs( T t )
  29. {
  30. if( t < 0 )
  31. return -t;
  32. return t;
  33. }
  34. inline float lowPrecisionSin( float radiant )
  35. {
  36. while( radiant < -3.14159265f )
  37. radiant += 6.28318531f;
  38. while( radiant > 3.14159265f )
  39. radiant -= 6.28318531f;
  40. float sin = 0;
  41. if( radiant < 0 )
  42. {
  43. sin = 1.27323954f * radiant + .405284735f * radiant * radiant;
  44. if( sin < 0 )
  45. sin = .225f * ( sin *-sin - sin ) + sin;
  46. else
  47. sin = .225f * ( sin * sin - sin ) + sin;
  48. }
  49. else
  50. {
  51. sin = 1.27323954f * radiant - 0.405284735f * radiant * radiant;
  52. if( sin < 0 )
  53. sin = .225f * ( sin *-sin - sin ) + sin;
  54. else
  55. sin = .225f * ( sin * sin - sin ) + sin;
  56. }
  57. return sin;
  58. }
  59. inline float lowPrecisionCos( float radiant )
  60. {
  61. return lowPrecisionSin( radiant + 3.14159265f / 2.f );
  62. }
  63. inline float lowPrecisionTan( float radiant )
  64. {
  65. return lowPrecisionSin( radiant ) / lowPrecisionCos( radiant );
  66. }
  67. inline float lowPrecisionACos( float cos )
  68. {
  69. float negate = float( cos < 0 );
  70. cos = abs( cos );
  71. float ret = -0.0187293f;
  72. ret = ret * cos;
  73. ret = ret + 0.0742610f;
  74. ret = ret * cos;
  75. ret = ret - 0.2121144f;
  76. ret = ret * cos;
  77. ret = ret + 1.5707288f;
  78. ret = ret * (float)sqrt( 1.0 - cos );
  79. ret = ret - 2 * negate * ret;
  80. return negate * 3.14159265358979f + ret;
  81. }
  82. inline float lowPrecisionASin( float sin )
  83. {
  84. return 3.14159265358979f / 2.f - lowPrecisionACos( sin );
  85. }
  86. }
  87. #endif