Math.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include "anki/math/MathCommonSrc.h"
  2. namespace anki {
  3. //==============================================================================
  4. const float Math::PI = 3.14159265358979323846;
  5. const float Math::EPSILON = 1.0e-6;
  6. //==============================================================================
  7. float Math::polynomialSinQuadrant(const float a)
  8. {
  9. return a * (1.0 + a * a * (-0.16666 + a * a *
  10. (0.0083143 - a * a * 0.00018542)));
  11. }
  12. //==============================================================================
  13. void Math::sinCos(const float a_, float& sina, float& cosa)
  14. {
  15. bool negative = false;
  16. float a = a_;
  17. if(a < 0.0)
  18. {
  19. a = -a;
  20. negative = true;
  21. }
  22. const float TWO_OVER_PI = 1.0 / (PI / 2.0);
  23. float floatA = TWO_OVER_PI * a;
  24. int intA = (int)floatA;
  25. const float RATIONAL_HALF_PI = 201 / 128.0;
  26. const float REMAINDER_HALF_PI = 4.8382679e-4;
  27. floatA = (a - RATIONAL_HALF_PI * intA) - REMAINDER_HALF_PI * intA;
  28. float floatAMinusHalfPi = (floatA - RATIONAL_HALF_PI) - REMAINDER_HALF_PI;
  29. switch(intA & 3)
  30. {
  31. case 0: // 0 - Pi/2
  32. sina = polynomialSinQuadrant(floatA);
  33. cosa = polynomialSinQuadrant(-floatAMinusHalfPi);
  34. break;
  35. case 1: // Pi/2 - Pi
  36. sina = polynomialSinQuadrant(-floatAMinusHalfPi);
  37. cosa = polynomialSinQuadrant(-floatA);
  38. break;
  39. case 2: // Pi - 3Pi/2
  40. sina = polynomialSinQuadrant(-floatA);
  41. cosa = polynomialSinQuadrant(floatAMinusHalfPi);
  42. break;
  43. case 3: // 3Pi/2 - 2Pi
  44. sina = polynomialSinQuadrant(floatAMinusHalfPi);
  45. cosa = polynomialSinQuadrant(floatA);
  46. break;
  47. };
  48. if(negative)
  49. {
  50. sina = -sina;
  51. }
  52. }
  53. } // end namespace