#include #include #include #include #include "ballistics.h" #include "constants.h" #include "atragmx.h" #include "ace.h" #include "vector.h" ATragMXSolution *ATragMXCalcSolution(ATragMXContext *ctx, ace_config *ace) { // // init section // ATragMXSolution *sln = NULL; if ((sln = calloc(1, sizeof(ATragMXSolution))) == NULL) { perror("ATragMXSolution: malloc failed"); return NULL; } // local data struct { double speed1; double speed2; } wind = { .speed1 = ctx->atmosphere.wind_speed[0], .speed2 = ctx->atmosphere.wind_speed[1], }; struct { double tx; double tz; Vec3 last_pos; Vec3 pos; Vec3 velocity; Vec3 accel; double speed; Vec3 gravity; double deltaT; } bullet = { .gravity = { .x = 0.0, .y = sin(ctx->gun.scope_angle + ctx->target.inclination_angle) * -GRAVITY, .z = cos(ctx->gun.scope_angle + ctx->target.inclination_angle) * -GRAVITY }, .deltaT = 1.0 / ctx->sim_steps, }; struct { double elevation; Windage windage; double lead; double time_of_flight; Vec3 true_velocity; double true_speed; double v_coriolis; double v_coriolis_deflection; double h_coriolis; double h_coriolis_deflection; double spin_drift; double spin_deflection; } local_solution = {0}; struct { double range; double true_range; double range_factor; double *range_card; } ctx_range = { .range_factor = ctx->store_range_card ? 1.0936133 : 1, .range_card = NULL, }; Vec3 wind1 = { .x = cos(270 - ctx->atmosphere.wind_dir * 30) * ctx->atmosphere.wind_speed[0], .y = sin(270 - ctx->atmosphere.wind_dir * 30) * ctx->atmosphere.wind_speed[0], .z = 0 }; Vec3 wind2 = { .x = cos(270 - ctx->atmosphere.wind_dir * 30) * ctx->atmosphere.wind_speed[1], .y = sin(270 - ctx->atmosphere.wind_dir * 30) * ctx->atmosphere.wind_speed[1], .z = 0 }; double wind_drift = 0.0; if (ace->ballistics->enabled) ctx->gun.ballistic_coef = atmospheric_correction(ctx->gun.ballistic_coef, ctx->atmosphere.temperature, ctx->atmosphere.barometric_pressure, ctx->atmosphere.relative_humidity, ctx->atmosphere.atmosphere_model); double eoetvoes_multiplier = 0.0; if (ace->ballistics->enabled) { eoetvoes_multiplier = 2 * (0.0000729 * ctx->gun.muzzle_velocity / -GRAVITY) * cos(ctx->target.latitude) * sin(ctx->target.direction); } bullet.pos.x = 0.0; bullet.pos.y = 0.0; bullet.pos.z = -(ctx->gun.bore_height / 100.0); bullet.velocity.x = 0.0; bullet.velocity.y = cos(ctx->gun.scope_angle) * ctx->gun.muzzle_velocity; bullet.velocity.z = sin(ctx->gun.scope_angle) * ctx->gun.muzzle_velocity; while (local_solution.time_of_flight < 15 && bullet.pos.y < ctx->target.range) { // calculate magnitude of bullet.velocity bullet.speed = vec3_magnitude(bullet.velocity); local_solution.true_velocity = vec3_diff(bullet.velocity, wind1); local_solution.true_speed = vec3_magnitude(local_solution.true_velocity); if (ace->ballistics->enabled) { double data = retard(ctx->gun.drag_model, ctx->gun.ballistic_coef, ctx->gun.muzzle_velocity, ctx->atmosphere.temperature); /* memcpy(bullet.accel, */ /* (double[3]){bullet.accel[0] != 0 ? -data : 0, */ /* bullet.accel[1] != 0 ? -data : 0, */ /* bullet.accel[2] != 0 ? -data : 0}, */ /* ); */ } } return sln; }