Browse Source

fix orbit tracker code quality issues

- Use fabs() for accumulated_rotation threshold (both directions)
- Reset body_index in reset_orbit_tracker()
- Remove unused compare_double() and compare_vec3()
- Rename min_time_days to min_time_seconds (eliminate conversion)
- Remove dead SECONDS_PER_DAY constant
- Add buffer overflow guards in dump_simulation_state()
- Use static const instead of #define for MIN_DISTANCE_CLAMP
test-refactor
cinnaboot 2 months ago
parent
commit
9b14d8471c
  1. 39
      src/test_utilities.cpp
  2. 7
      src/test_utilities.h

39
src/test_utilities.cpp

@ -3,9 +3,7 @@
#include <cmath> #include <cmath>
#include <cstdio> #include <cstdio>
#define MIN_DISTANCE_CLAMP 1.0 static const double MIN_DISTANCE_CLAMP = 1.0;
static const double SECONDS_PER_DAY = 86400.0;
double calculate_kinetic_energy(CelestialBody* body) { double calculate_kinetic_energy(CelestialBody* body) {
Vec3 v = body->global_velocity; Vec3 v = body->global_velocity;
@ -47,7 +45,7 @@ OrbitalMetrics calculate_orbital_metrics(CelestialBody* body, CelestialBody* par
return metrics; 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)); OrbitTracker* tracker = (OrbitTracker*)malloc(sizeof(OrbitTracker));
tracker->body_index = body_index; tracker->body_index = body_index;
tracker->initial_angle = 0.0; 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->wrap_count = 0;
tracker->orbit_completed = false; tracker->orbit_completed = false;
tracker->time_at_completion = 0.0; 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->inclination = 0.0;
tracker->longitude_of_ascending_node = 0.0; tracker->longitude_of_ascending_node = 0.0;
tracker->argument_of_periapsis = 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) { 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 inclination, double lon_ascending_node,
double argument_of_periapsis) { 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->inclination = inclination;
tracker->longitude_of_ascending_node = lon_ascending_node; tracker->longitude_of_ascending_node = lon_ascending_node;
tracker->argument_of_periapsis = argument_of_periapsis; 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) { static void reset_tracker_fields(OrbitTracker* tracker) {
tracker->body_index = 0;
tracker->initial_angle = 0.0; tracker->initial_angle = 0.0;
tracker->previous_angle = 0.0; tracker->previous_angle = 0.0;
tracker->accumulated_rotation = 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; tracker->accumulated_rotation += angle_diff;
double min_time_seconds = tracker->min_time_days * SECONDS_PER_DAY; if (current_time > tracker->min_time_seconds &&
(tracker->accumulated_rotation >= 2.0 * M_PI ||
if (tracker->wrap_count >= 2 && tracker->accumulated_rotation <= -2.0 * M_PI)) {
current_time > min_time_seconds &&
fabs(tracker->accumulated_rotation) >= 2.0 * M_PI) {
tracker->orbit_completed = true; tracker->orbit_completed = true;
tracker->time_at_completion = current_time; tracker->time_at_completion = current_time;
} }
@ -149,26 +146,19 @@ void destroy_orbit_tracker(OrbitTracker* tracker) {
free(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, int dump_simulation_state(SimulationState* sim, const char* label,
char* buffer, int buffer_size) { char* buffer, int buffer_size) {
int offset = 0; int offset = 0;
if (offset >= buffer_size) return offset;
offset += snprintf(buffer + offset, buffer_size - offset, offset += snprintf(buffer + offset, buffer_size - offset,
"\n=== %s (t=%.0f s) ===\n", label, sim->time); "\n=== %s (t=%.0f s) ===\n", label, sim->time);
offset += snprintf(buffer + offset, buffer_size - offset, offset += snprintf(buffer + offset, buffer_size - offset,
"Bodies (%d):\n", sim->body_count); "Bodies (%d):\n", sim->body_count);
for (int i = 0; i < sim->body_count; i++) { for (int i = 0; i < sim->body_count; i++) {
if (offset >= buffer_size) break;
offset += snprintf(buffer + offset, buffer_size - offset, offset += snprintf(buffer + offset, buffer_size - offset,
" [%d] %s: mass=%.2e kg\n", " [%d] %s: mass=%.2e kg\n",
i, sim->bodies[i].name, sim->bodies[i].mass); 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); "Spacecraft (%d):\n", sim->craft_count);
if (sim->spacecraft) { if (sim->spacecraft) {
for (int i = 0; i < sim->craft_count; i++) { for (int i = 0; i < sim->craft_count; i++) {
if (offset >= buffer_size) break;
Spacecraft* s = &sim->spacecraft[i]; Spacecraft* s = &sim->spacecraft[i];
double r = vec3_magnitude(s->local_position); double r = vec3_magnitude(s->local_position);
double v = vec3_magnitude(s->local_velocity); 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.semi_major_axis,
s->orbit.eccentricity, s->orbit.eccentricity,
s->orbit.argument_of_periapsis); s->orbit.argument_of_periapsis);
if (offset >= buffer_size) break;
offset += snprintf(buffer + offset, buffer_size - offset, offset += snprintf(buffer + offset, buffer_size - offset,
" pos=(%.1f, %.1f, %.1f) vel=(%.1f, %.1f, %.1f)\n", " pos=(%.1f, %.1f, %.1f) vel=(%.1f, %.1f, %.1f)\n",
s->local_position.x, s->local_position.y, s->local_position.z, 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); "Maneuvers (%d):\n", sim->maneuver_count);
if (sim->maneuvers) { if (sim->maneuvers) {
for (int i = 0; i < sim->maneuver_count; i++) { for (int i = 0; i < sim->maneuver_count; i++) {
if (offset >= buffer_size) break;
Maneuver* m = &sim->maneuvers[i]; Maneuver* m = &sim->maneuvers[i];
offset += snprintf(buffer + offset, buffer_size - offset, offset += snprintf(buffer + offset, buffer_size - offset,
" [%d] %s: craft=%d dir=%d dv=%.4f trigger=%d val=%.2f exec=%d\n", " [%d] %s: craft=%d dir=%d dv=%.4f trigger=%d val=%.2f exec=%d\n",

7
src/test_utilities.h

@ -20,7 +20,7 @@ struct OrbitTracker {
bool orbit_completed; bool orbit_completed;
double time_at_completion; double time_at_completion;
int body_index; int body_index;
double min_time_days; double min_time_seconds;
// Orbital elements for 3D angle calculation // Orbital elements for 3D angle calculation
double inclination; double inclination;
@ -35,7 +35,7 @@ double calculate_system_total_energy(SimulationState* sim);
OrbitalMetrics calculate_orbital_metrics(CelestialBody* body, CelestialBody* parent); OrbitalMetrics calculate_orbital_metrics(CelestialBody* body, CelestialBody* parent);
OrbitTracker* create_orbit_tracker(int body_index); 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, OrbitTracker* create_orbit_tracker_3d(int body_index, double min_time_days,
double inclination, double lon_ascending_node, double inclination, double lon_ascending_node,
double argument_of_periapsis); 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 update_orbit_tracker(OrbitTracker* tracker, CelestialBody* body, CelestialBody* parent, double current_time);
void destroy_orbit_tracker(OrbitTracker* tracker); 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. // Write simulation state to a caller-allocated buffer.
// Returns number of characters written (excluding null terminator). // Returns number of characters written (excluding null terminator).
// Caller must ensure buffer is large enough (recommended 4096 bytes). // Caller must ensure buffer is large enough (recommended 4096 bytes).

Loading…
Cancel
Save