diff --git a/src/test_utilities.cpp b/src/test_utilities.cpp index 7af7f4e..bfb898e 100644 --- a/src/test_utilities.cpp +++ b/src/test_utilities.cpp @@ -3,9 +3,7 @@ #include #include -#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_days) { +OrbitTracker* create_orbit_tracker_with_min_time(int body_index, double min_time_seconds) { 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_days = min_time_days; + tracker->min_time_seconds = min_time_seconds; 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, 100.0); + return create_orbit_tracker_with_min_time(body_index, 86400.0); } -OrbitTracker* create_orbit_tracker_3d(int body_index, double min_time_days, +OrbitTracker* create_orbit_tracker_3d(int body_index, double min_time_seconds, double inclination, double lon_ascending_node, double argument_of_periapsis) { - OrbitTracker* tracker = create_orbit_tracker_with_min_time(body_index, min_time_days); + OrbitTracker* tracker = create_orbit_tracker_with_min_time(body_index, min_time_seconds); 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", diff --git a/src/test_utilities.h b/src/test_utilities.h index a2f1fe2..27c3a83 100644 --- a/src/test_utilities.h +++ b/src/test_utilities.h @@ -20,7 +20,7 @@ struct OrbitTracker { bool orbit_completed; double time_at_completion; int body_index; - double min_time_days; + double min_time_seconds; // Orbital elements for 3D angle calculation double inclination; @@ -35,7 +35,7 @@ double calculate_system_total_energy(SimulationState* sim); OrbitalMetrics calculate_orbital_metrics(CelestialBody* body, CelestialBody* parent); OrbitTracker* create_orbit_tracker(int body_index); -OrbitTracker* create_orbit_tracker_with_min_time(int body_index, double min_time_days); +OrbitTracker* create_orbit_tracker_with_min_time(int body_index, double min_time_seconds); OrbitTracker* create_orbit_tracker_3d(int body_index, double min_time_days, double inclination, double lon_ascending_node, double argument_of_periapsis); @@ -43,9 +43,6 @@ void reset_orbit_tracker(OrbitTracker* tracker); void update_orbit_tracker(OrbitTracker* tracker, CelestialBody* body, CelestialBody* parent, double current_time); void destroy_orbit_tracker(OrbitTracker* tracker); -bool compare_double(double a, double b, double tolerance); -bool compare_vec3(Vec3 a, Vec3 b, double tolerance); - // Write simulation state to a caller-allocated buffer. // Returns number of characters written (excluding null terminator). // Caller must ensure buffer is large enough (recommended 4096 bytes).