|
|
|
@ -123,19 +123,6 @@ static bool angle_between(double current, double next, double target) { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Propagate orbital state forward by dt and return new position/velocity
|
|
|
|
|
|
|
|
static void propagate_state_by_dt(OrbitalElements elements, double parent_mass, double dt, |
|
|
|
|
|
|
|
Vec3* out_r, Vec3* out_v, Vec3* out_h, |
|
|
|
|
|
|
|
Vec3* out_e_vec, double* out_e_mag) { |
|
|
|
|
|
|
|
OrbitalElements future_elements = propagate_orbital_elements(elements, dt, parent_mass); |
|
|
|
|
|
|
|
orbital_elements_to_cartesian(future_elements, parent_mass, out_r, out_v); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*out_h = vec3_cross(*out_r, *out_v); |
|
|
|
|
|
|
|
double mu = G * parent_mass; |
|
|
|
|
|
|
|
*out_e_vec = calculate_eccentricity_vector(*out_r, *out_v, *out_h, mu); |
|
|
|
|
|
|
|
*out_e_mag = vec3_magnitude(*out_e_vec); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool check_maneuver_trigger(Maneuver* maneuver, Spacecraft* craft, SimulationState* sim) { |
|
|
|
bool check_maneuver_trigger(Maneuver* maneuver, Spacecraft* craft, SimulationState* sim) { |
|
|
|
switch (maneuver->trigger_type) { |
|
|
|
switch (maneuver->trigger_type) { |
|
|
|
case TRIGGER_TIME: |
|
|
|
case TRIGGER_TIME: |
|
|
|
@ -170,11 +157,12 @@ bool check_maneuver_trigger(Maneuver* maneuver, Spacecraft* craft, SimulationSta |
|
|
|
if (current_diff < 0.01) return true; |
|
|
|
if (current_diff < 0.01) return true; |
|
|
|
|
|
|
|
|
|
|
|
// Propagate orbit forward by one time step to check if we'll cross trigger
|
|
|
|
// Propagate orbit forward by one time step to check if we'll cross trigger
|
|
|
|
Vec3 future_r, future_v, future_h, future_e_vec; |
|
|
|
OrbitalElements future_elements = propagate_orbital_elements(craft->orbit, sim->dt, parent->mass); |
|
|
|
double future_e_mag; |
|
|
|
Vec3 future_r, future_v; |
|
|
|
propagate_state_by_dt(craft->orbit, parent->mass, sim->dt, |
|
|
|
orbital_elements_to_cartesian(future_elements, parent->mass, &future_r, &future_v); |
|
|
|
&future_r, &future_v, &future_h, |
|
|
|
Vec3 future_h = vec3_cross(future_r, future_v); |
|
|
|
&future_e_vec, &future_e_mag); |
|
|
|
Vec3 future_e_vec = calculate_eccentricity_vector(future_r, future_v, future_h, mu); |
|
|
|
|
|
|
|
double future_e_mag = vec3_magnitude(future_e_vec); |
|
|
|
|
|
|
|
|
|
|
|
double future_r_mag = vec3_magnitude(future_r); |
|
|
|
double future_r_mag = vec3_magnitude(future_r); |
|
|
|
if (future_r_mag < 1.0) return false; |
|
|
|
if (future_r_mag < 1.0) return false; |
|
|
|
|