@ -3,9 +3,7 @@
# include <cmath>
# include <cstdio>
# define MIN_DISTANCE_CLAMP 1.0
static const double SECONDS_PER_DAY = 86400.0 ;
static const double MIN_DISTANCE_CLAMP = 1.0 ;
double calculate_kinetic_energy ( CelestialBody * body ) {
Vec3 v = body - > global_velocity ;
@ -47,7 +45,7 @@ OrbitalMetrics calculate_orbital_metrics(CelestialBody* body, CelestialBody* par
return metrics ;
}
OrbitTracker * create_orbit_tracker_with_min_time ( int body_index , double min_time_day s ) {
OrbitTracker * create_orbit_tracker_with_min_time ( int body_index , double min_time_secon ds ) {
OrbitTracker * tracker = ( OrbitTracker * ) malloc ( sizeof ( OrbitTracker ) ) ;
tracker - > body_index = body_index ;
tracker - > initial_angle = 0.0 ;
@ -56,7 +54,7 @@ OrbitTracker* create_orbit_tracker_with_min_time(int body_index, double min_time
tracker - > wrap_count = 0 ;
tracker - > orbit_completed = false ;
tracker - > time_at_completion = 0.0 ;
tracker - > min_time_day s = min_time_day s ;
tracker - > min_time_secon ds = min_time_secon ds ;
tracker - > inclination = 0.0 ;
tracker - > longitude_of_ascending_node = 0.0 ;
tracker - > argument_of_periapsis = 0.0 ;
@ -65,13 +63,13 @@ OrbitTracker* create_orbit_tracker_with_min_time(int body_index, double min_time
}
OrbitTracker * create_orbit_tracker ( int body_index ) {
return create_orbit_tracker_with_min_time ( body_index , 1 00.0) ;
return create_orbit_tracker_with_min_time ( body_index , 864 00.0) ;
}
OrbitTracker * create_orbit_tracker_3d ( int body_index , double min_time_day s ,
OrbitTracker * create_orbit_tracker_3d ( int body_index , double min_time_secon ds ,
double inclination , double lon_ascending_node ,
double argument_of_periapsis ) {
OrbitTracker * tracker = create_orbit_tracker_with_min_time ( body_index , min_time_day s ) ;
OrbitTracker * tracker = create_orbit_tracker_with_min_time ( body_index , min_time_secon ds ) ;
tracker - > inclination = inclination ;
tracker - > longitude_of_ascending_node = lon_ascending_node ;
tracker - > argument_of_periapsis = argument_of_periapsis ;
@ -80,6 +78,7 @@ OrbitTracker* create_orbit_tracker_3d(int body_index, double min_time_days,
}
static void reset_tracker_fields ( OrbitTracker * tracker ) {
tracker - > body_index = 0 ;
tracker - > initial_angle = 0.0 ;
tracker - > previous_angle = 0.0 ;
tracker - > accumulated_rotation = 0.0 ;
@ -133,11 +132,9 @@ void update_orbit_tracker(OrbitTracker* tracker, CelestialBody* body, CelestialB
tracker - > accumulated_rotation + = angle_diff ;
double min_time_seconds = tracker - > min_time_days * SECONDS_PER_DAY ;
if ( tracker - > wrap_count > = 2 & &
current_time > min_time_seconds & &
fabs ( tracker - > accumulated_rotation ) > = 2.0 * M_PI ) {
if ( current_time > tracker - > min_time_seconds & &
( tracker - > accumulated_rotation > = 2.0 * M_PI | |
tracker - > accumulated_rotation < = - 2.0 * M_PI ) ) {
tracker - > orbit_completed = true ;
tracker - > time_at_completion = current_time ;
}
@ -149,26 +146,19 @@ void destroy_orbit_tracker(OrbitTracker* tracker) {
free ( tracker ) ;
}
bool compare_double ( double a , double b , double tolerance ) {
return fabs ( a - b ) < = tolerance ;
}
bool compare_vec3 ( Vec3 a , Vec3 b , double tolerance ) {
return fabs ( a . x - b . x ) < = tolerance & &
fabs ( a . y - b . y ) < = tolerance & &
fabs ( a . z - b . z ) < = tolerance ;
}
int dump_simulation_state ( SimulationState * sim , const char * label ,
char * buffer , int buffer_size ) {
int offset = 0 ;
if ( offset > = buffer_size ) return offset ;
offset + = snprintf ( buffer + offset , buffer_size - offset ,
" \n === %s (t=%.0f s) === \n " , label , sim - > time ) ;
offset + = snprintf ( buffer + offset , buffer_size - offset ,
" Bodies (%d): \n " , sim - > body_count ) ;
for ( int i = 0 ; i < sim - > body_count ; i + + ) {
if ( offset > = buffer_size ) break ;
offset + = snprintf ( buffer + offset , buffer_size - offset ,
" [%d] %s: mass=%.2e kg \n " ,
i , sim - > bodies [ i ] . name , sim - > bodies [ i ] . mass ) ;
@ -178,6 +168,7 @@ int dump_simulation_state(SimulationState* sim, const char* label,
" Spacecraft (%d): \n " , sim - > craft_count ) ;
if ( sim - > spacecraft ) {
for ( int i = 0 ; i < sim - > craft_count ; i + + ) {
if ( offset > = buffer_size ) break ;
Spacecraft * s = & sim - > spacecraft [ i ] ;
double r = vec3_magnitude ( s - > local_position ) ;
double v = vec3_magnitude ( s - > local_velocity ) ;
@ -188,6 +179,7 @@ int dump_simulation_state(SimulationState* sim, const char* label,
s - > orbit . semi_major_axis ,
s - > orbit . eccentricity ,
s - > orbit . argument_of_periapsis ) ;
if ( offset > = buffer_size ) break ;
offset + = snprintf ( buffer + offset , buffer_size - offset ,
" pos=(%.1f, %.1f, %.1f) vel=(%.1f, %.1f, %.1f) \n " ,
s - > local_position . x , s - > local_position . y , s - > local_position . z ,
@ -199,6 +191,7 @@ int dump_simulation_state(SimulationState* sim, const char* label,
" Maneuvers (%d): \n " , sim - > maneuver_count ) ;
if ( sim - > maneuvers ) {
for ( int i = 0 ; i < sim - > maneuver_count ; i + + ) {
if ( offset > = buffer_size ) break ;
Maneuver * m = & sim - > maneuvers [ i ] ;
offset + = snprintf ( buffer + offset , buffer_size - offset ,
" [%d] %s: craft=%d dir=%d dv=%.4f trigger=%d val=%.2f exec=%d \n " ,