Functions.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // Copyright (C) 2009-2021, 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. {
  9. template<typename Scalar>
  10. static Scalar polynomialSinQuadrant(const Scalar a)
  11. {
  12. return Scalar(a * (1.0 + a * a * (-0.16666 + a * a * (0.0083143 - a * a * 0.00018542))));
  13. }
  14. template<typename Scalar>
  15. static void sinCosInternal(const Scalar a_, Scalar& sina, Scalar& cosa)
  16. {
  17. #if ANKI_EXTRA_CHECKS
  18. sina = sin(a_);
  19. cosa = cos(a_);
  20. #else
  21. Bool negative = false;
  22. Scalar a = a_;
  23. if(a < 0.0)
  24. {
  25. a = -a;
  26. negative = true;
  27. }
  28. const Scalar TWO_OVER_PI = Scalar(1.0 / (PI / 2.0));
  29. Scalar floatA = TWO_OVER_PI * a;
  30. I intA = (int)floatA;
  31. const Scalar RATIONAL_HALF_PI = 201 / 128.0;
  32. const Scalar REMAINDER_HALF_PI = Scalar(4.8382679e-4);
  33. floatA = (a - RATIONAL_HALF_PI * Scalar(intA)) - REMAINDER_HALF_PI * Scalar(intA);
  34. Scalar 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. #endif
  59. }
  60. void sinCos(const F32 a, F32& sina, F32& cosa)
  61. {
  62. sinCosInternal(a, sina, cosa);
  63. }
  64. void sinCos(const F64 a, F64& sina, F64& cosa)
  65. {
  66. sinCosInternal(a, sina, cosa);
  67. }
  68. } // end namespace anki