summaryrefslogtreecommitdiffstats
path: root/src/atragmx.c
blob: af68b2cd6b574aee5b668b17c3d2a1baa6fd37a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>

#include "ballistics.h"
#include "constants.h"
#include "atragmx.h"
#include "ace.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;
        double last_pos[3];
        double pos[3];
        double velocity[3];
        double accel[3];
		double speed;
		double gravity[3];
		double deltaT;
    } bullet = {
        .gravity = {
			[0] = 0.0,
			[1] = sin(ctx->gun.scope_angle + ctx->target.inclination_angle)
				  * -GRAVITY,
			[2] = 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;
		double true_velocity[3];
		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,
    };

	double wind1[3] = {
		[0] = cos(270 - ctx->atmosphere.wind_dir * 30)
			  * ctx->atmosphere.wind_speed[0],
		[1] = sin(270 - ctx->atmosphere.wind_dir * 30)
			  * ctx->atmosphere.wind_speed[0],
		[2] = 0
	};

	double wind2[3] = {
		[0] = cos(270 - ctx->atmosphere.wind_dir * 30)
			  * ctx->atmosphere.wind_speed[1],
		[1] = sin(270 - ctx->atmosphere.wind_dir * 30)
			  * ctx->atmosphere.wind_speed[1],
		[2] = 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);
	}
	
    memcpy(bullet.pos,
		   (double[3]){0.0,
					   0.0,
					   -(ctx->gun.bore_height / 100.0)},
           sizeof(bullet.pos));
    
    memcpy(bullet.velocity,
		   (double[3]){0.0,
					   cos(ctx->gun.scope_angle) * ctx->gun.muzzle_velocity,
					   sin(ctx->gun.scope_angle) * ctx->gun.muzzle_velocity},
           sizeof(bullet.pos));

    while (local_solution.time_of_flight < 15
		   && bullet.pos[1] < ctx->target.range) {
		// calculate magnitude of bullet.velocity
		bullet.speed = hypot(bullet.velocity[0],
							 hypot(bullet.velocity[1], bullet.velocity[2]));

		
	}
    
	return sln;
}