summaryrefslogtreecommitdiffstats
path: root/src/solar_system/orbit.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/solar_system/orbit.rs')
-rw-r--r--src/solar_system/orbit.rs64
1 files changed, 48 insertions, 16 deletions
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<BodyId>,
- 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<BodyId> {
+ pub fn parent(&self) -> BodyId {
self.parent
}
@@ -33,17 +69,13 @@ impl StaticOrbit
time: Second)
-> cgmath::Vector3<f64>
{
- if self.parent.is_none() {
- return cgmath::Vector3::<f64>::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);