Math.cpp 2.1 KB

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