First stable release. The function names, arguments, and defaults in this version are the ones the package will keep; future changes to them will be deprecated first, not made silently.
get_energy(), get_momentum(),
get_angular_momentum(): Total kinetic and potential energy,
total linear momentum, and total angular momentum of the system at every
time step of a simulation. get_energy() reads
G and softening from the simulation output so
the potential is computed with the same force law that produced the
run.
conserved_quantities(): The three quantities above
joined into one tibble with their relative errors against the initial
values. Verlet and Euler-Cromer keep momentum and angular momentum to
rounding error; the energy error is the integrator’s report
card.
get_orbital_elements(): The inverse of
add_body_keplerian(). Recovers the osculating Keplerian
elements (a, e, i, lan, arg_pe, nu) and period of a body relative to a
parent at every time step, from the simulated position and
velocity.
continue_simulation(): Pick up a run from its last
state with a new (or the same) time step and append the result, with
time continuing from where the previous run ended. Makes
segmented runs possible: large steps far from periapsis, small steps
through it.
system_from_simulation(): Rebuild an
orbit_system from any snapshot of a simulation, so a run
can be modified and continued.
shift_reference_frame() accepts
center_id = "barycenter" to re-center on the system’s
center of mass at every time step.
add_body_keplerian() accepts hyperbolic orbits
(e > 1 with a negative semi-major axis), so interstellar
visitors and flybys can be set up from elements. Exactly parabolic
orbits (e = 1) remain unsupported.
simulate_system() records G,
softening, method, and time_step
as attributes of its output; the new analysis functions use them as
defaults.
remove_body(): Remove one or more bodies from a
system by name. Accepts a single name or a character vector for removing
multiple bodies at once.
get_bodies(): Extract the bodies tibble from an
orbit_system. Useful for inspecting, filtering, or saving
body states without reaching into the object’s internals.
save_system() / load_system(): Save a
full orbit_system to an .rds file and restore
it later. Preserves everything — bodies, gravitational constant, and
class.
export_bodies(): Write the body table (id, mass,
position, velocity) to a CSV file for sharing with collaborators or
loading into other tools like Python or Excel.
print.orbit_system(): Custom print method that
displays a clean summary with a header line and the bodies as a tibble,
instead of dumping the raw list structure.
add_body_keplerian(): Add a body to the system using
classical Keplerian orbital elements (semi-major axis, eccentricity,
inclination, longitude of ascending node, argument of periapsis, true
anomaly) instead of raw Cartesian state vectors. The elements are
converted to position and velocity relative to a specified parent
body.
add_planet(): Add a known solar system body by name
with real orbital data looked up automatically. Just specify the name
and parent — mass, semi-major axis, eccentricity, inclination, and
orientation are filled in from JPL DE440 values. Any element can be
overridden for “what if” scenarios (e.g.,
add_planet("Mars", parent = "Sun", e = 0) for a circular
Mars).
load_solar_system(): One-liner that builds a
complete solar system — the Sun, all eight planets, the Moon, and
optionally Pluto — using real orbital data from the JPL DE440 ephemeris.
Returns a ready-to-simulate orbit_system. Use
moon = FALSE or pluto = FALSE to exclude those
bodies.
three_d parameter on plot_orbits(),
plot_system(), and animate_system() now
supports FALSE to force 2D output even when the data has
Z-axis motion. Previously, three_d = FALSE was the default
but could not override the auto-detection.
Fixed frozen 3D animations in animate_system_3d()
caused by redraw = FALSE in plotly animation
options.
Initial release.
create_system() / add_body() /
simulate_system() pipe-friendly API.shift_reference_frame() to re-center simulations on any
body.plot_orbits() / plot_orbits_3d() for quick
trajectory plots (ggplot2 2D, plotly 3D).plot_system() / plot_system_3d() for
single-time-step snapshots.animate_system() / animate_system_3d() for
animated orbits via gganimate or plotly.gravitational_constant for scaling gravity in
create_system().seconds_per_hour, seconds_per_day,
seconds_per_year time helpers.