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

75 lines
2.2 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_ASTRO_ORBIT_HPP
  20. #define ANTKEEPER_ASTRO_ORBIT_HPP
  21. #include "utility/fundamental-types.hpp"
  22. namespace astro
  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. * Iteratively solves Kepler's equation for eccentric anomaly, E.
  46. *
  47. * @param ec Eccentricity, e.
  48. * @param ma Mean anomaly, M (radians).
  49. * @param tolerance Tolerance of solution.
  50. * @param iterations Maximum number of iterations.
  51. * @return Eccentric anomaly.
  52. */
  53. double solve_kepler(double ec, double ma, double tolerance, std::size_t iterations);
  54. /**
  55. * Calculates the ecliptic rectangular orbital position from Keplerian orbital elements.
  56. *
  57. * @note Only works for elliptical orbits.
  58. *
  59. * @param elements Orbital elements.
  60. * @param ke_tolerance Kepler's equation tolerance.
  61. * @param ke_iterations Kepler's equation iterations.
  62. * @return Orbital state.
  63. */
  64. double3 orbital_elements_to_ecliptic(const orbital_elements& elements, double ke_tolerance, std::size_t ke_iterations);
  65. } // namespace astro
  66. #endif // ANTKEEPER_ASTRO_ORBIT_HPP