@@ 1,4 1,4 @@
-use std::{f32::consts::PI, ops::Range};
+use std::{f32::{self, consts::PI}, ops::Range};
use bevy::window::WindowResized;
@@ 30,24 30,32 @@ fn update_orbits(
let Projection::Orthographic(ref projection) = camera.2.clone() else { return };
//image.clear(&(Color::BLACK.to_srgba().to_u8_array()));
- let mut p_mass = 0.0;
- let mut p_transform = Transform::default();
+ let mut p_mass = None;
+ let mut p_transform = None;
let (sun_mass, _, sun_transform) = planets.iter().filter(|planet| planet.1.name == "Sun").next().unwrap();
+ let mut closest = f32::INFINITY;
for (mass, planet, transform) in planets {
if planet.name == "Sun" { continue }
- let a = sun_transform.translation - transform.translation;
- let hill_sphere = a.length()*(mass.0/(3.0*(sun_mass.0+mass.0))).powf(1.0/3.0);
- if hill_sphere > (me.0.translation - transform.translation).length() {
- p_mass = mass.0;
- p_transform = *transform;
- break;
+ let (other_mass, p, other_transform) = planets.iter().filter(|f_planet| f_planet.1.name == planet.orbit.clone().unwrap().orbiting).next().unwrap();
+ let a = other_transform.translation - transform.translation;
+ let hill_sphere = a.length()*(mass.0/(3.0*(other_mass.0+mass.0))).powf(1.0/3.0);
+
+ gizmos.circle_2d(transform.translation.truncate(), hill_sphere, Color::linear_rgb(0.02, 0.02, 0.02));
+
+ let rel_dist = (me.0.translation - transform.translation).length();
+ if rel_dist < closest && hill_sphere > rel_dist {
+ p_mass = Some(mass.0);
+ p_transform = Some(*transform);
+ closest = rel_dist;
}
}
- if p_mass == 0.0 {
- p_mass = sun_mass.0;
- p_transform = *sun_transform;
+ if p_mass.is_none() {
+ p_mass = Some(sun_mass.0);
+ p_transform = Some(*sun_transform);
}
+ let p_mass = p_mass.unwrap();
+ let p_transform = p_transform.unwrap();
// orbit magic
let rel_pos = me.0.translation - p_transform.translation;