21 if constexpr (std::is_same_v<C, centers::Barycentric>) {
23 }
else if constexpr (std::is_same_v<C, centers::Heliocentric>) {
25 }
else if constexpr (std::is_same_v<C, centers::Geocentric>) {
28 static_assert(!
sizeof(C),
29 "kepler_position only supports barycentric, heliocentric, or geocentric centers");
62 return {qtty::AstronomicalUnit(c.semi_major_axis_au),
64 qtty::Degree(c.inclination_deg),
65 qtty::Degree(c.lon_ascending_node_deg),
66 qtty::Degree(c.arg_periapsis_deg),
67 qtty::Degree(c.mean_anomaly_deg),
71 siderust_orbit_t
to_c()
const {
82template <
typename C = centers::Heliocentric>
83inline cartesian::Position<C, frames::EclipticMeanJ2000, qtty::AstronomicalUnit>
85 static_assert(centers::is_center_v<C>,
"C must be a valid center tag (default: Heliocentric)");
86 siderust_cartesian_pos_t c_out{};
87 check_status(siderust_kepler_position_ex(orbit.
to_c(), detail::orbit_ref_center_id<C>(),
91 qtty::AstronomicalUnit(c_out.x), qtty::AstronomicalUnit(c_out.y),
92 qtty::AstronomicalUnit(c_out.z));
105 return {qtty::AstronomicalUnit(c.semi_major_axis_au),
107 qtty::Degree(c.inclination_deg),
108 qtty::Degree(c.lon_ascending_node_deg),
109 qtty::Degree(c.arg_periapsis_deg),
110 AngularRate{qtty::Degree(c.mean_motion_deg_per_day), qtty::Day(1.0)},
114 siderust_mean_motion_orbit_t
to_c()
const {
126 siderust_cartesian_pos_t out{};
128 "MeanMotionOrbit::position_at");
129 return {qtty::AstronomicalUnit(out.x), qtty::AstronomicalUnit(out.y),
130 qtty::AstronomicalUnit(out.z)};
144 return {qtty::AstronomicalUnit(c.periapsis_distance_au),
146 qtty::Degree(c.inclination_deg),
147 qtty::Degree(c.lon_ascending_node_deg),
148 qtty::Degree(c.arg_periapsis_deg),
149 qtty::Degree(c.mean_anomaly_deg),
153 siderust_conic_orbit_t
to_c()
const {
169 siderust_cartesian_pos_t out{};
170 check_status(siderust_conic_position(
to_c(), jd.value(), &out),
"ConicOrbit::position_at");
171 return {qtty::AstronomicalUnit(out.x), qtty::AstronomicalUnit(out.y),
172 qtty::AstronomicalUnit(out.z)};
177 SiderustPreparedOrbitHandle handle_ =
nullptr;
183 check_status(siderust_prepared_orbit_create(orbit.
to_c(), &handle_),
"PreparedOrbit");
188 siderust_prepared_orbit_destroy(handle_);
196 other.handle_ =
nullptr;
200 if (
this != &other) {
202 siderust_prepared_orbit_destroy(handle_);
204 handle_ = other.handle_;
205 other.handle_ =
nullptr;
210 explicit operator bool()
const {
return handle_ !=
nullptr; }
214 siderust_cartesian_pos_t out{};
215 check_status(siderust_prepared_orbit_position(handle_, jd.value(), &out),
216 "PreparedOrbit::position_at");
217 return {qtty::AstronomicalUnit(out.x), qtty::AstronomicalUnit(out.y),
218 qtty::AstronomicalUnit(out.z)};
225 return os <<
"Elliptic";
227 return os <<
"Hyperbolic";
229 return os <<
"Unknown";
PreparedOrbit & operator=(PreparedOrbit &&other) noexcept
PreparedOrbit(const KeplerianOrbit &orbit)
PreparedOrbit(const PreparedOrbit &)=delete
PreparedOrbit(PreparedOrbit &&other) noexcept
cartesian::Position< centers::Heliocentric, frames::EclipticMeanJ2000, qtty::AstronomicalUnit > position_at(const Time< TT, JD > &jd) const
PreparedOrbit & operator=(const PreparedOrbit &)=delete
Coordinate module umbrella.
Error handling and utility base for the siderust C++ wrapper.
constexpr SiderustOrbitRefCenter orbit_ref_center_id()
tempoch::EncodedTime< Scale, Format > Time
void check_status(siderust_status_t status, const char *operation)
std::ostream & operator<<(std::ostream &os, AzimuthExtremumKind kind)
Stream operator for AzimuthExtremumKind.
cartesian::Position< C, frames::EclipticMeanJ2000, qtty::AstronomicalUnit > kepler_position(const KeplerianOrbit &orbit, const Time< TT, JD > &jd)
double deg_per_day() const
qtty::Degree lon_ascending_node
Eccentricity eccentricity
qtty::AstronomicalUnit periapsis_distance
cartesian::Position< centers::Heliocentric, frames::EclipticMeanJ2000, qtty::AstronomicalUnit > position_at(const Time< TT, JD > &jd) const
qtty::Degree mean_anomaly
qtty::Degree arg_periapsis
siderust_conic_orbit_t to_c() const
constexpr ConicKind kind() const
static ConicOrbit from_c(const siderust_conic_orbit_t &c)
qtty::AstronomicalUnit semi_major_axis
static KeplerianOrbit from_c(const siderust_orbit_t &c)
qtty::Degree lon_ascending_node
qtty::Degree mean_anomaly
siderust_orbit_t to_c() const
qtty::Degree arg_periapsis
Eccentricity eccentricity
qtty::AstronomicalUnit semi_major_axis
cartesian::Position< centers::Heliocentric, frames::EclipticMeanJ2000, qtty::AstronomicalUnit > position_at(const Time< TT, JD > &jd) const
qtty::Degree arg_periapsis
static MeanMotionOrbit from_c(const siderust_mean_motion_orbit_t &c)
siderust_mean_motion_orbit_t to_c() const
qtty::Degree lon_ascending_node
Eccentricity eccentricity
A 3D Cartesian position, compile-time tagged by center, frame, unit.
Public siderust time tags and typed time/period aliases.