siderust-cpp 0.8.0
Header-only C++ wrapper for siderust
Loading...
Searching...
No Matches
bodycentric_transforms.hpp
Go to the documentation of this file.
1#pragma once
2
47#include "../ffi_core.hpp"
48#include "../orbital_center.hpp"
49#include "../time.hpp"
50#include "cartesian.hpp"
51
52#include <cstdint>
53
54namespace siderust {
55
56// ============================================================================
57// BodycentricPos<F, U>
58// ============================================================================
59
73template <typename F, typename U = qtty::AstronomicalUnit> struct BodycentricPos {
74 static_assert(frames::is_frame_v<F>, "F must be a valid frame tag");
75
78
81
82 // -- Accessors --
83
84 U x() const { return pos.x(); }
85 U y() const { return pos.y(); }
86 U z() const { return pos.z(); }
87
89 U distance() const { return pos.distance(); }
90
92 U distance_to(const BodycentricPos &other) const { return pos.distance_to(other.pos); }
93
95 const BodycentricParams &center_params() const { return params; }
96
97 // ── Inverse transform ─────────────────────────────────────────────────────
98
109};
110
111// ============================================================================
112// to_bodycentric() — free function template
113// ============================================================================
114
136template <typename C, typename F, typename U>
138 const BodycentricParams &params,
139 const Time<TT, JD> &jd) {
140 static_assert(centers::is_center_v<C>, "C must be a valid center tag");
141
142 siderust_cartesian_pos_t c_pos = pos.to_c();
143 SiderustBodycentricParams c_params = params.to_c();
144 siderust_cartesian_pos_t c_out{};
145
146 check_status(siderust_to_bodycentric(c_pos, c_params, jd.value(), &c_out), "to_bodycentric");
147
148 cartesian::Position<centers::Bodycentric, F, U> result_pos(U(c_out.x), U(c_out.y), U(c_out.z));
149 return BodycentricPos<F, U>{result_pos, params};
150}
151
152// ============================================================================
153// BodycentricPos::to_geocentric() — out-of-line member implementation
154// ============================================================================
155
156template <typename F, typename U>
157inline cartesian::Position<centers::Geocentric, F, U>
159 siderust_cartesian_pos_t c_pos = pos.to_c();
160 SiderustBodycentricParams c_params = params.to_c();
161 siderust_cartesian_pos_t c_out{};
162
163 check_status(siderust_from_bodycentric(c_pos, c_params, jd.value(), &c_out), "from_bodycentric");
164
165 return cartesian::Position<centers::Geocentric, F, U>(U(c_out.x), U(c_out.y), U(c_out.z));
166}
167
168} // namespace siderust
tempoch::EncodedTime< Scale, Format > Time
Definition time.hpp:36
void check_status(siderust_status_t status, const char *operation)
Definition ffi_core.hpp:111
BodycentricPos< F, U > to_bodycentric(const cartesian::Position< C, F, U > &pos, const BodycentricParams &params, const Time< TT, JD > &jd)
Transform a position to body-centric coordinates.
Parameters for a body-centric coordinate system.
SiderustBodycentricParams to_c() const
Result of a body-centric coordinate transformation.
cartesian::Position< centers::Geocentric, F, U > to_geocentric(const Time< TT, JD > &jd) const
Transform back to geocentric coordinates.
const BodycentricParams & center_params() const
Access the embedded orbital parameters of the body.
BodycentricParams params
Orbital parameters of the body used as the coordinate origin.
cartesian::Position< centers::Bodycentric, F, U > pos
Raw Cartesian position tagged with the Bodycentric center.
U distance() const
Distance from the body (norm of the embedded pos).
U distance_to(const BodycentricPos &other) const
Distance to another body-centric position.
A 3D Cartesian position, compile-time tagged by center, frame, unit.
siderust_cartesian_pos_t to_c() const
Convert to C FFI struct.