siderust-cpp 0.8.0
Header-only C++ wrapper for siderust
Loading...
Searching...
No Matches
orbit.hpp
Go to the documentation of this file.
1#pragma once
2
8#include "coordinates.hpp"
9#include "ffi_core.hpp"
10#include "time.hpp"
11
12#include <cstdint>
13#include <type_traits>
14#include <utility>
15
16namespace siderust {
17
18namespace detail {
19
20template <typename C> constexpr SiderustOrbitRefCenter orbit_ref_center_id() {
21 if constexpr (std::is_same_v<C, centers::Barycentric>) {
22 return 0;
23 } else if constexpr (std::is_same_v<C, centers::Heliocentric>) {
24 return 1;
25 } else if constexpr (std::is_same_v<C, centers::Geocentric>) {
26 return 2;
27 } else {
28 static_assert(!sizeof(C),
29 "kepler_position only supports barycentric, heliocentric, or geocentric centers");
30 return 1;
31 }
32}
33
34} // namespace detail
35
36enum class ConicKind : std::uint8_t {
37 Elliptic = 0,
38 Hyperbolic = 1,
39};
40
42 double value;
43};
44
46 qtty::Degree angle;
47 qtty::Day per;
48
49 double deg_per_day() const { return angle.value() / per.value(); }
50};
51
53 qtty::AstronomicalUnit semi_major_axis;
55 qtty::Degree inclination;
56 qtty::Degree lon_ascending_node;
57 qtty::Degree arg_periapsis;
58 qtty::Degree mean_anomaly;
60
61 static KeplerianOrbit from_c(const siderust_orbit_t &c) {
62 return {qtty::AstronomicalUnit(c.semi_major_axis_au),
63 Eccentricity{c.eccentricity},
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),
68 Time<TT, JD>(c.epoch_jd)};
69 }
70
71 siderust_orbit_t to_c() const {
72 return {semi_major_axis.value(),
74 inclination.value(),
75 lon_ascending_node.value(),
76 arg_periapsis.value(),
77 mean_anomaly.value(),
78 epoch.value()};
79 }
80};
81
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>(),
88 jd.value(), &c_out),
89 "kepler_position");
91 qtty::AstronomicalUnit(c_out.x), qtty::AstronomicalUnit(c_out.y),
92 qtty::AstronomicalUnit(c_out.z));
93}
94
96 qtty::AstronomicalUnit semi_major_axis;
98 qtty::Degree inclination;
99 qtty::Degree lon_ascending_node;
100 qtty::Degree arg_periapsis;
103
104 static MeanMotionOrbit from_c(const siderust_mean_motion_orbit_t &c) {
105 return {qtty::AstronomicalUnit(c.semi_major_axis_au),
106 Eccentricity{c.eccentricity},
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)},
111 Time<TT, JD>(c.epoch_jd)};
112 }
113
114 siderust_mean_motion_orbit_t to_c() const {
115 return {semi_major_axis.value(),
117 inclination.value(),
118 lon_ascending_node.value(),
119 arg_periapsis.value(),
121 epoch.value()};
122 }
123
125 position_at(const Time<TT, JD> &jd) const {
126 siderust_cartesian_pos_t out{};
127 check_status(siderust_mean_motion_position(to_c(), jd.value(), &out),
128 "MeanMotionOrbit::position_at");
129 return {qtty::AstronomicalUnit(out.x), qtty::AstronomicalUnit(out.y),
130 qtty::AstronomicalUnit(out.z)};
131 }
132};
133
135 qtty::AstronomicalUnit periapsis_distance;
137 qtty::Degree inclination;
138 qtty::Degree lon_ascending_node;
139 qtty::Degree arg_periapsis;
140 qtty::Degree mean_anomaly;
142
143 static ConicOrbit from_c(const siderust_conic_orbit_t &c) {
144 return {qtty::AstronomicalUnit(c.periapsis_distance_au),
145 Eccentricity{c.eccentricity},
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),
150 Time<TT, JD>(c.epoch_jd)};
151 }
152
153 siderust_conic_orbit_t to_c() const {
154 return {periapsis_distance.value(),
156 inclination.value(),
157 lon_ascending_node.value(),
158 arg_periapsis.value(),
159 mean_anomaly.value(),
160 epoch.value()};
161 }
162
163 constexpr ConicKind kind() const {
165 }
166
168 position_at(const Time<TT, JD> &jd) 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)};
173 }
174};
175
177 SiderustPreparedOrbitHandle handle_ = nullptr;
178
179public:
180 PreparedOrbit() = default;
181
182 explicit PreparedOrbit(const KeplerianOrbit &orbit) {
183 check_status(siderust_prepared_orbit_create(orbit.to_c(), &handle_), "PreparedOrbit");
184 }
185
187 if (handle_) {
188 siderust_prepared_orbit_destroy(handle_);
189 }
190 }
191
192 PreparedOrbit(const PreparedOrbit &) = delete;
194
195 PreparedOrbit(PreparedOrbit &&other) noexcept : handle_(other.handle_) {
196 other.handle_ = nullptr;
197 }
198
200 if (this != &other) {
201 if (handle_) {
202 siderust_prepared_orbit_destroy(handle_);
203 }
204 handle_ = other.handle_;
205 other.handle_ = nullptr;
206 }
207 return *this;
208 }
209
210 explicit operator bool() const { return handle_ != nullptr; }
211
213 position_at(const Time<TT, JD> &jd) const {
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)};
219 }
220};
221
222inline std::ostream &operator<<(std::ostream &os, ConicKind kind) {
223 switch (kind) {
225 return os << "Elliptic";
227 return os << "Hyperbolic";
228 }
229 return os << "Unknown";
230}
231
232} // namespace siderust
PreparedOrbit & operator=(PreparedOrbit &&other) noexcept
Definition orbit.hpp:199
PreparedOrbit(const KeplerianOrbit &orbit)
Definition orbit.hpp:182
PreparedOrbit(const PreparedOrbit &)=delete
PreparedOrbit(PreparedOrbit &&other) noexcept
Definition orbit.hpp:195
cartesian::Position< centers::Heliocentric, frames::EclipticMeanJ2000, qtty::AstronomicalUnit > position_at(const Time< TT, JD > &jd) const
Definition orbit.hpp:213
PreparedOrbit & operator=(const PreparedOrbit &)=delete
Coordinate module umbrella.
Error handling and utility base for the siderust C++ wrapper.
constexpr SiderustOrbitRefCenter orbit_ref_center_id()
Definition orbit.hpp:20
tempoch::EncodedTime< Scale, Format > Time
Definition time.hpp:36
void check_status(siderust_status_t status, const char *operation)
Definition ffi_core.hpp:111
std::ostream & operator<<(std::ostream &os, AzimuthExtremumKind kind)
Stream operator for AzimuthExtremumKind.
Definition azimuth.hpp:395
cartesian::Position< C, frames::EclipticMeanJ2000, qtty::AstronomicalUnit > kepler_position(const KeplerianOrbit &orbit, const Time< TT, JD > &jd)
Definition orbit.hpp:84
qtty::Degree angle
Definition orbit.hpp:46
double deg_per_day() const
Definition orbit.hpp:49
qtty::Degree lon_ascending_node
Definition orbit.hpp:138
Eccentricity eccentricity
Definition orbit.hpp:136
qtty::AstronomicalUnit periapsis_distance
Definition orbit.hpp:135
cartesian::Position< centers::Heliocentric, frames::EclipticMeanJ2000, qtty::AstronomicalUnit > position_at(const Time< TT, JD > &jd) const
Definition orbit.hpp:168
qtty::Degree mean_anomaly
Definition orbit.hpp:140
qtty::Degree arg_periapsis
Definition orbit.hpp:139
siderust_conic_orbit_t to_c() const
Definition orbit.hpp:153
Time< TT, JD > epoch
Definition orbit.hpp:141
constexpr ConicKind kind() const
Definition orbit.hpp:163
qtty::Degree inclination
Definition orbit.hpp:137
static ConicOrbit from_c(const siderust_conic_orbit_t &c)
Definition orbit.hpp:143
qtty::AstronomicalUnit semi_major_axis
Definition orbit.hpp:53
static KeplerianOrbit from_c(const siderust_orbit_t &c)
Definition orbit.hpp:61
qtty::Degree inclination
Definition orbit.hpp:55
qtty::Degree lon_ascending_node
Definition orbit.hpp:56
Time< TT, JD > epoch
Definition orbit.hpp:59
qtty::Degree mean_anomaly
Definition orbit.hpp:58
siderust_orbit_t to_c() const
Definition orbit.hpp:71
qtty::Degree arg_periapsis
Definition orbit.hpp:57
Eccentricity eccentricity
Definition orbit.hpp:54
AngularRate mean_motion
Definition orbit.hpp:101
qtty::AstronomicalUnit semi_major_axis
Definition orbit.hpp:96
qtty::Degree inclination
Definition orbit.hpp:98
cartesian::Position< centers::Heliocentric, frames::EclipticMeanJ2000, qtty::AstronomicalUnit > position_at(const Time< TT, JD > &jd) const
Definition orbit.hpp:125
qtty::Degree arg_periapsis
Definition orbit.hpp:100
static MeanMotionOrbit from_c(const siderust_mean_motion_orbit_t &c)
Definition orbit.hpp:104
Time< TT, JD > epoch
Definition orbit.hpp:102
siderust_mean_motion_orbit_t to_c() const
Definition orbit.hpp:114
qtty::Degree lon_ascending_node
Definition orbit.hpp:99
Eccentricity eccentricity
Definition orbit.hpp:97
A 3D Cartesian position, compile-time tagged by center, frame, unit.
Public siderust time tags and typed time/period aliases.