Functions.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // Copyright (C) 2009-2022, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Math/Functions.h>
  6. #include <AnKi/Config.h>
  7. namespace anki {
  8. template<typename Scalar>
  9. static Scalar polynomialSinQuadrant(const Scalar a)
  10. {
  11. return Scalar(a * (1.0 + a * a * (-0.16666 + a * a * (0.0083143 - a * a * 0.00018542))));
  12. }
  13. template<typename Scalar>
  14. static void sinCosInternal(const Scalar a_, Scalar& sina, Scalar& cosa)
  15. {
  16. #if ANKI_EXTRA_CHECKS
  17. sina = sin(a_);
  18. cosa = cos(a_);
  19. #else
  20. Bool negative = false;
  21. Scalar a = a_;
  22. if(a < 0.0)
  23. {
  24. a = -a;
  25. negative = true;
  26. }
  27. constexpr Scalar k2OverPi = Scalar(1.0 / (kPi / 2.0));
  28. Scalar floatA = k2OverPi * a;
  29. I intA = (int)floatA;
  30. const Scalar RATIONAL_HALF_PI = 201 / 128.0;
  31. const Scalar REMAINDER_HALF_PI = Scalar(4.8382679e-4);
  32. floatA = (a - RATIONAL_HALF_PI * Scalar(intA)) - REMAINDER_HALF_PI * Scalar(intA);
  33. Scalar floatAMinusHalfPi = (floatA - RATIONAL_HALF_PI) - REMAINDER_HALF_PI;
  34. switch(intA & 3)
  35. {
  36. case 0: // 0 - Pi/2
  37. sina = polynomialSinQuadrant(floatA);
  38. cosa = polynomialSinQuadrant(-floatAMinusHalfPi);
  39. break;
  40. case 1: // Pi/2 - Pi
  41. sina = polynomialSinQuadrant(-floatAMinusHalfPi);
  42. cosa = polynomialSinQuadrant(-floatA);
  43. break;
  44. case 2: // Pi - 3Pi/2
  45. sina = polynomialSinQuadrant(-floatA);
  46. cosa = polynomialSinQuadrant(floatAMinusHalfPi);
  47. break;
  48. case 3: // 3Pi/2 - 2Pi
  49. sina = polynomialSinQuadrant(floatAMinusHalfPi);
  50. cosa = polynomialSinQuadrant(floatA);
  51. break;
  52. };
  53. if(negative)
  54. {
  55. sina = -sina;
  56. }
  57. #endif
  58. }
  59. void sinCos(const F32 a, F32& sina, F32& cosa)
  60. {
  61. sinCosInternal(a, sina, cosa);
  62. }
  63. void sinCos(const F64 a, F64& sina, F64& cosa)
  64. {
  65. sinCosInternal(a, sina, cosa);
  66. }
  67. } // end namespace anki