|
|
|
|
@ -5,10 +5,10 @@
|
|
|
|
|
const static uint ELLIPSE_VERT_COUNT = 256; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
system_2body |
|
|
|
|
systemInit(grav_body gb, orbital_elements el) |
|
|
|
|
TwoBodySystem |
|
|
|
|
systemInit(GravBody gb, OrbitalElements el) |
|
|
|
|
{ |
|
|
|
|
system_2body s = {0}; |
|
|
|
|
TwoBodySystem s = {0}; |
|
|
|
|
s.body = gb; |
|
|
|
|
s.elements = el; |
|
|
|
|
s.ep = ellipseInitAE(el.a, el.e); |
|
|
|
|
@ -22,20 +22,20 @@ systemInit(grav_body gb, orbital_elements el)
|
|
|
|
|
return s; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
grav_body |
|
|
|
|
GravBody |
|
|
|
|
gravBodyInit(double mu, double r) |
|
|
|
|
{ |
|
|
|
|
grav_body gb = {0}; |
|
|
|
|
GravBody gb = {0}; |
|
|
|
|
gb.mu = mu; |
|
|
|
|
gb.radius = r; |
|
|
|
|
return gb; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ellipse_parameters |
|
|
|
|
EllipseParameters |
|
|
|
|
ellipseInitAB(double a, double b) |
|
|
|
|
{ |
|
|
|
|
assert(a > 0 && b > 0 && a >= b); |
|
|
|
|
ellipse_parameters ep = { a, b }; |
|
|
|
|
EllipseParameters ep = { a, b }; |
|
|
|
|
ep.c = sqrt(a * a - b * b); |
|
|
|
|
ep.e = ep.c / ep.a; |
|
|
|
|
ep.p = ep.a * (1 - pow(ep.e, 2)); |
|
|
|
|
@ -44,7 +44,7 @@ ellipseInitAB(double a, double b)
|
|
|
|
|
return ep; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ellipse_parameters |
|
|
|
|
EllipseParameters |
|
|
|
|
ellipseInitAE(double a, double e) |
|
|
|
|
{ |
|
|
|
|
assert(e >= 0 && e < 1); |
|
|
|
|
@ -53,7 +53,7 @@ ellipseInitAE(double a, double e)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool |
|
|
|
|
ellipseValidate(const ellipse_parameters& ep) |
|
|
|
|
ellipseValidate(const EllipseParameters& ep) |
|
|
|
|
{ |
|
|
|
|
// TODO: find out why satellite position gets wonky with orbit
|
|
|
|
|
// eccentricity > 0.995 while passing through true anom = 0.
|
|
|
|
|
@ -66,32 +66,32 @@ ellipseValidate(const ellipse_parameters& ep)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool |
|
|
|
|
ellipsesEqual(ellipse_parameters& e1, ellipse_parameters& e2) |
|
|
|
|
ellipsesEqual(EllipseParameters& e1, EllipseParameters& e2) |
|
|
|
|
{ |
|
|
|
|
return (e1.a == e2.a && |
|
|
|
|
e1.b == e2.b && |
|
|
|
|
e1.e == e2.e); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ellipse_3d |
|
|
|
|
ellipseInit3D(ellipse_parameters ep, uint vert_count) |
|
|
|
|
Ellipse3D |
|
|
|
|
ellipseInit3D(EllipseParameters ep, uint vert_count) |
|
|
|
|
{ |
|
|
|
|
assert(ep.a > 0 && ep.b > 0 && |
|
|
|
|
ep.a >= ep.b && |
|
|
|
|
vert_count > 0); |
|
|
|
|
|
|
|
|
|
ellipse_3d e3d = { nullptr, vert_count}; |
|
|
|
|
Ellipse3D e3d = { nullptr, vert_count}; |
|
|
|
|
// TODO: need to free this allocation at some point
|
|
|
|
|
e3d.vertices = UTIL_ALLOC(vert_count, glm::vec3); |
|
|
|
|
ellipse3DUpdate(ep, e3d); |
|
|
|
|
return e3d; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
orbital_elements |
|
|
|
|
OrbitalElements |
|
|
|
|
orbitInit(double a, double e) |
|
|
|
|
{ |
|
|
|
|
// TODO: remaining elements: iota, ohm, omega, nu
|
|
|
|
|
orbital_elements o = {0}; |
|
|
|
|
OrbitalElements o = {0}; |
|
|
|
|
o.a = a; |
|
|
|
|
o.e = e; |
|
|
|
|
o.nu = 0; |
|
|
|
|
@ -141,7 +141,7 @@ polarToRect(double angle, double r)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
ellipse3DUpdate(ellipse_parameters ep, ellipse_3d& e3d) |
|
|
|
|
ellipse3DUpdate(EllipseParameters ep, Ellipse3D& e3d) |
|
|
|
|
{ |
|
|
|
|
double angle = 2 * M_PI / e3d.vert_count; |
|
|
|
|
|
|
|
|
|
@ -213,7 +213,7 @@ getNextTrialValue(double err, double ecc, double test_anom, double mean_anom)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
double |
|
|
|
|
getPropagatedEccAnomaly(system_2body sys, |
|
|
|
|
getPropagatedEccAnomaly(TwoBodySystem sys, |
|
|
|
|
double initial_anom, |
|
|
|
|
double time_step) |
|
|
|
|
{ |
|
|
|
|
@ -241,7 +241,7 @@ getPropagatedEccAnomaly(system_2body sys,
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
double |
|
|
|
|
getPropagatedTrueAnomaly(system_2body sys, |
|
|
|
|
getPropagatedTrueAnomaly(TwoBodySystem sys, |
|
|
|
|
double initial_anom, |
|
|
|
|
double time_step) |
|
|
|
|
{ |
|
|
|
|
@ -266,10 +266,10 @@ orbitClampAngle(double theta)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
double |
|
|
|
|
orbitTimeSincePeriapsis(system_2body sys, double theta); |
|
|
|
|
orbitTimeSincePeriapsis(TwoBodySystem sys, double theta); |
|
|
|
|
|
|
|
|
|
double |
|
|
|
|
orbitGetTimeOfFlight(system_2body sys, double theta_begin, double theta_end) |
|
|
|
|
orbitGetTimeOfFlight(TwoBodySystem sys, double theta_begin, double theta_end) |
|
|
|
|
{ |
|
|
|
|
double e = sys.ep.e; |
|
|
|
|
|
|
|
|
|
|