💿🐜 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.

107 lines
3.1 KiB

  1. /*
  2. * Copyright (C) 2020 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_CELESTIAL_MECHANICS_HPP
  20. #define ANTKEEPER_CELESTIAL_MECHANICS_HPP
  21. #include "utility/fundamental-types.hpp"
  22. namespace ast
  23. {
  24. /**
  25. * Contains six orbital elements which describe a Keplerian orbit.
  26. */
  27. struct orbital_elements
  28. {
  29. double ec; ///< Eccentricity, e
  30. double a; ///< Semi-major axis, a
  31. double i; ///< Inclination, i (radians)
  32. double om; ///< Longitude of the ascending node, OMEGA (radians)
  33. double w; ///< Argument of periapsis, w (radians)
  34. double ma; ///< Mean anomaly, M (radians)
  35. };
  36. /**
  37. * Orbital state vectors.
  38. */
  39. struct orbital_state
  40. {
  41. double3 r; ///< Cartesian position, r.
  42. double3 v; ///< Cartesian velocity, v.
  43. };
  44. /**
  45. * Approximates the obliquity of the ecliptic.
  46. *
  47. * @param jd Julian date.
  48. * @return Obliquity of the ecliptic, in radians.
  49. */
  50. double approx_ecliptic_obliquity(double jd);
  51. /**
  52. * Approximates the ecliptic coordinates of the Earth's sun.
  53. *
  54. * @param jd Julian date.
  55. * @return Ecliptic rectangular geocentric coordinates of the Earth's sun, with distance in AU.
  56. */
  57. double3 approx_sun_ecliptic(double jd);
  58. /**
  59. * Approximates the ecliptic coordinates of the Earth's moon.
  60. *
  61. * @param jd Julian date.
  62. * @return Ecliptic rectangular geocentric coordinates of the Earth's moon, with distance in Earth radii.
  63. */
  64. double3 approx_moon_ecliptic(double jd);
  65. /**
  66. * Approximates the ecliptic rotation of the Earth's moon.
  67. *
  68. * @param jd Julian date.
  69. * @return Rotation matrix representing the moon's rotation in ecliptic space.
  70. */
  71. double3x3 approx_moon_ecliptic_rotation(double jd);
  72. /**
  73. * Iteratively solves Kepler's equation for eccentric anomaly, E.
  74. *
  75. * @param ec Eccentricity, e.
  76. * @param ma Mean anomaly, M (radians).
  77. * @param tolerance Tolerance of solution.
  78. * @param iterations Maximum number of iterations.
  79. * @return Eccentric anomaly.
  80. */
  81. double solve_kepler(double ec, double ma, double tolerance, std::size_t iterations);
  82. /**
  83. * Calculates the ecliptic rectangular orbital position from Keplerian orbital elements.
  84. *
  85. * @note Only works for elliptical orbits.
  86. *
  87. * @param elements Orbital elements.
  88. * @param ke_tolerance Kepler's equation tolerance.
  89. * @param ke_iterations Kepler's equation iterations.
  90. * @return Orbital state.
  91. */
  92. double3 orbital_elements_to_ecliptic(const orbital_elements& elements, double ke_tolerance, std::size_t ke_iterations);
  93. } // namespace ast
  94. #endif // ANTKEEPER_CELESTIAL_MECHANICS_HPP