From 9788d9037ad7199701b1710c28559cb96bce5aec Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Wed, 6 May 2026 12:01:42 -0400 Subject: regenerate orbit lines based on system tick interval --- src/solar_system/orbit.rs | 64 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 16 deletions(-) (limited to 'src/solar_system/orbit.rs') diff --git a/src/solar_system/orbit.rs b/src/solar_system/orbit.rs index b042bd3..461de7b 100644 --- a/src/solar_system/orbit.rs +++ b/src/solar_system/orbit.rs @@ -1,29 +1,65 @@ -use crate::solar_system::{Angle, BodyId, Kilometers, OrbitalBody, Percentage}; +use crate::solar_system::{Angle, BodyId, Kilometers, OrbitalBody, Percentage, SolarSystem}; use crate::timeman::{Second}; pub struct StaticOrbit { - pub parent: Option, - pub eccentricity: Percentage, - pub inclination: Angle, - pub long_asc_node: Angle, - pub long_periapsis: Angle, - pub mean_long: Angle, - - pub semi_major_axis: Kilometers, + parent: BodyId, + eccentricity: Percentage, + inclination: Angle, + long_asc_node: Angle, + long_periapsis: Angle, + mean_long: Angle, + + semi_major_axis: Kilometers, } impl StaticOrbit { + pub fn new( + parent: BodyId, + eccentricity: Percentage, + inclination: Angle, + long_asc_node: Angle, + long_periapsis: Angle, + mean_long: Angle, + semi_major_axis: Kilometers) + -> Self { + Self { + parent, + eccentricity, + inclination, + long_asc_node, + long_periapsis, + mean_long, + semi_major_axis + } + } + + pub fn new_circular( + parent: &OrbitalBody, + radius: Kilometers) + -> Self + { + Self { + parent: parent.id(), + eccentricity: 1e-6, + inclination: 0.0, + long_asc_node: 0.0, + long_periapsis: 0.0, + mean_long: 0.0, + semi_major_axis: radius + } + } + pub fn period( &self, this_body: &OrbitalBody) -> Second { - ((self.semi_major_axis.powf(3.0) / this_body.sgp).sqrt() * std::f64::consts::TAU) as Second + ((self.semi_major_axis.powf(3.0) / this_body.sgp()).sqrt() * std::f64::consts::TAU) as Second } - pub fn parent(&self) -> Option { + pub fn parent(&self) -> BodyId { self.parent } @@ -33,17 +69,13 @@ impl StaticOrbit time: Second) -> cgmath::Vector3 { - if self.parent.is_none() { - return cgmath::Vector3::::new(0.0, 0.0, 0.0); - } - let eccentricity = self.eccentricity; let long_asc_node = self.long_asc_node; let arg_periaps = self.long_periapsis - long_asc_node; let sma_cubed = self.semi_major_axis.powf(3.0); - let mean_motion = (this_body.sgp / sma_cubed).sqrt(); + let mean_motion = (this_body.sgp() / sma_cubed).sqrt(); let mean_anomaly_epoch = self.mean_long - self.long_periapsis; let mean_anomaly = mean_anomaly_epoch + (mean_motion * time as f64); -- cgit v1.2.3