💿🐜 Antkeeper source code https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
2.5 KiB

  1. /*
  2. * Copyright (C) 2021 Christopher J. Howard
  3. *
  4. * This file is part of Antkeeper source code.
  5. *
  6. * Antkeeper source code is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * Antkeeper source code is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with Antkeeper source code. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #ifndef ANTKEEPER_MATH_QUATERNION_TYPE_HPP
  20. #define ANTKEEPER_MATH_QUATERNION_TYPE_HPP
  21. #include <cmath>
  22. namespace math {
  23. /**
  24. * A quaternion type is a tuple made of a scalar (real) part and vector (imaginary) part.
  25. *
  26. * @tparam T Scalar type.
  27. */
  28. template <class T>
  29. struct quaternion
  30. {
  31. typedef T scalar_type;
  32. scalar_type w;
  33. scalar_type x;
  34. scalar_type y;
  35. scalar_type z;
  36. /// Returns the rotation identity quaternion.
  37. static constexpr quaternion identity();
  38. /**
  39. * Returns a quaternion representing a rotation about the x-axis.
  40. *
  41. * @param angle Angle of rotation, in radians.
  42. * @return Quaternion representing an x-axis rotation.
  43. */
  44. static quaternion rotate_x(scalar_type angle);
  45. /**
  46. * Returns a quaternion representing a rotation about the y-axis.
  47. *
  48. * @param angle Angle of rotation, in radians.
  49. * @return Quaternion representing an y-axis rotation.
  50. */
  51. static quaternion rotate_y(scalar_type angle);
  52. /**
  53. * Returns a quaternion representing a rotation about the z-axis.
  54. *
  55. * @param angle Angle of rotation, in radians.
  56. * @return Quaternion representing an z-axis rotation.
  57. */
  58. static quaternion rotate_z(scalar_type angle);
  59. };
  60. template <class T>
  61. constexpr quaternion<T> quaternion<T>::identity()
  62. {
  63. return {T(1), T(0), T(0), T(0)};
  64. };
  65. template <class T>
  66. quaternion<T> quaternion<T>::rotate_x(scalar_type angle)
  67. {
  68. return {std::cos(angle * T(0.5)), std::sin(angle * T(0.5)), T(0), T(0)};
  69. }
  70. template <class T>
  71. quaternion<T> quaternion<T>::rotate_y(scalar_type angle)
  72. {
  73. return {std::cos(angle * T(0.5)), T(0), std::sin(angle * T(0.5)), T(0)};
  74. }
  75. template <class T>
  76. quaternion<T> quaternion<T>::rotate_z(scalar_type angle)
  77. {
  78. return {std::cos(angle * T(0.5)), T(0), T(0), std::sin(angle * T(0.5))};
  79. }
  80. } // namespace math
  81. #endif // ANTKEEPER_MATH_QUATERNION_TYPE_HPP