From b17014e6d6f8252c48e737358e5f303b673e922f Mon Sep 17 00:00:00 2001 From: core Date: Sun, 16 Apr 2023 18:28:57 -0400 Subject: [PATCH] working on vis_viva --- server/src/orbit/mod.rs | 3 ++- server/src/orbit/orbit.rs | 19 +++++++++++++++++++ server/src/orbit/vis_viva.rs | 3 +++ server/src/planet.rs | 2 +- 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 server/src/orbit/vis_viva.rs diff --git a/server/src/orbit/mod.rs b/server/src/orbit/mod.rs index a8121661d1ada07057f8217e2300a68f3c19d145..818ce8bf162203fc960dfa5b841e16479ec8191a 100644 --- a/server/src/orbit/mod.rs +++ b/server/src/orbit/mod.rs @@ -1,4 +1,5 @@ pub mod constants; pub mod orbit; pub mod newtonian; -pub mod kepler; \ No newline at end of file +pub mod kepler; +pub mod vis_viva; \ No newline at end of file diff --git a/server/src/orbit/orbit.rs b/server/src/orbit/orbit.rs index 9e7ff2ce845d4a503766e4b01d76acae46e1370e..05a609e76b5e32bbd5c95d4a6a7563709f06835b 100644 --- a/server/src/orbit/orbit.rs +++ b/server/src/orbit/orbit.rs @@ -3,6 +3,25 @@ use nalgebra::{vector, Vector2}; use crate::orbit::newtonian::solve_kepler_with_newtonian; +use crate::orbit::vis_viva::vis_viva; +use crate::planet::GRAVITY; + +pub fn calculate_vector_of_orbit(periapsis: f64, apoapsis: f64, t: f64, mass_of_bigger: f64) -> Vector2 { + let semi_major_length = (apoapsis + periapsis) / 2.0; + let linear_eccentricity = semi_major_length - periapsis; // distance between center and focus + let eccentricity = linear_eccentricity / semi_major_length; // 0: circle. 1: parabola. in between: ellipse + + let distances = calculate_point_on_orbit(periapsis, apoapsis, t); + let distance_x = distances[0]; + let distance_y = distances[1]; + + let distance = (distance_x * distance_x + distance_y * distance_y).sqrt(); + + let velocity = vis_viva(distance, semi_major_length, GRAVITY, mass_of_bigger); + + let ellipse_center_x = -linear_eccentricity; + let ellipse_center_y = apoapsis - semi_major_length; +} pub fn calculate_point_on_orbit(periapsis: f64, apoapsis: f64, t: f64) -> Vector2 { let semi_major_length = (apoapsis + periapsis) / 2.0; diff --git a/server/src/orbit/vis_viva.rs b/server/src/orbit/vis_viva.rs new file mode 100644 index 0000000000000000000000000000000000000000..22c9a17e966d1b43e20a5432efcd0600600a32c6 --- /dev/null +++ b/server/src/orbit/vis_viva.rs @@ -0,0 +1,3 @@ +pub fn vis_viva(distance_between_centers: f64, semi_major: f64, g: f64, mass_of_bigger: f64) -> f64 { + (g * mass_of_bigger * (2.0 / distance_between_centers - 1.0 / semi_major)).sqrt() +} \ No newline at end of file diff --git a/server/src/planet.rs b/server/src/planet.rs index 51371ff658118f41846e8a79452026be0b052d84..bfee762da621f5a72e2347fa68378930a7af4467 100644 --- a/server/src/planet.rs +++ b/server/src/planet.rs @@ -8,7 +8,7 @@ use crate::orbit::constants::{EARTH_MASS, EARTH_RADIUS, MOON_APOAPSIS, MOON_MASS use crate::orbit::orbit::{calculate_point_on_orbit, calculate_world_position_of_orbit}; //const GRAVITY: f64 = 0.001; -const GRAVITY: f64 = 12.6674; +pub const GRAVITY: f64 = 12.6674; #[derive(Clone)] pub struct Planet {