|
|
|
@ -8,7 +8,7 @@ |
|
|
|
#include "util.h" |
|
|
|
#include "util.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct ellipse_parameters |
|
|
|
struct EllipseParameters |
|
|
|
{ |
|
|
|
{ |
|
|
|
double a; // NOTE: semi-major axis
|
|
|
|
double a; // NOTE: semi-major axis
|
|
|
|
double b; // NOTE: semi-minor axis
|
|
|
|
double b; // NOTE: semi-minor axis
|
|
|
|
@ -19,7 +19,7 @@ struct ellipse_parameters |
|
|
|
glm::vec2 f2; // NOTE: 'vacant' focus
|
|
|
|
glm::vec2 f2; // NOTE: 'vacant' focus
|
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
struct orbital_elements |
|
|
|
struct OrbitalElements |
|
|
|
{ |
|
|
|
{ |
|
|
|
// NOTE: classical orbital elements
|
|
|
|
// NOTE: classical orbital elements
|
|
|
|
double a; // NOTE: semimajor axis
|
|
|
|
double a; // NOTE: semimajor axis
|
|
|
|
@ -30,20 +30,20 @@ struct orbital_elements |
|
|
|
double nu; // NOTE: (ν) true anomaly at T0
|
|
|
|
double nu; // NOTE: (ν) true anomaly at T0
|
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
struct ellipse_3d |
|
|
|
struct Ellipse3D |
|
|
|
{ |
|
|
|
{ |
|
|
|
glm::vec3* vertices; |
|
|
|
glm::vec3* vertices; |
|
|
|
uint vert_count; |
|
|
|
uint vert_count; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
struct grav_body |
|
|
|
struct GravBody |
|
|
|
{ |
|
|
|
{ |
|
|
|
double mu; // NOTE: (μ) gravitational parameter
|
|
|
|
double mu; // NOTE: (μ) gravitational parameter
|
|
|
|
double radius; // NOTE: radius of ideal sphere representing the body
|
|
|
|
double radius; // NOTE: radius of ideal sphere representing the body
|
|
|
|
// double r_atmos; // TODO: bodies w/ atmosphere
|
|
|
|
// double r_atmos; // TODO: bodies w/ atmosphere
|
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
struct satellite |
|
|
|
struct Satellite |
|
|
|
{ |
|
|
|
{ |
|
|
|
glm::vec3 position; |
|
|
|
glm::vec3 position; |
|
|
|
glm::vec3 velocity; |
|
|
|
glm::vec3 velocity; |
|
|
|
@ -54,13 +54,13 @@ struct satellite |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
// NOTE: top level composite for 2 body system
|
|
|
|
// NOTE: top level composite for 2 body system
|
|
|
|
struct system_2body |
|
|
|
struct TwoBodySystem |
|
|
|
{ |
|
|
|
{ |
|
|
|
grav_body body; |
|
|
|
GravBody body; |
|
|
|
satellite sat; |
|
|
|
Satellite sat; |
|
|
|
ellipse_parameters ep; |
|
|
|
EllipseParameters ep; |
|
|
|
ellipse_3d e3d; |
|
|
|
Ellipse3D e3d; |
|
|
|
orbital_elements elements; |
|
|
|
OrbitalElements elements; |
|
|
|
|
|
|
|
|
|
|
|
double epsilon; // NOTE: (ε) specific orbital energy, MJ/kg
|
|
|
|
double epsilon; // NOTE: (ε) specific orbital energy, MJ/kg
|
|
|
|
double h; // NOTE: angular momentum
|
|
|
|
double h; // NOTE: angular momentum
|
|
|
|
@ -70,33 +70,33 @@ struct system_2body |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
system_2body |
|
|
|
TwoBodySystem |
|
|
|
systemInit(grav_body gb, orbital_elements el); |
|
|
|
systemInit(GravBody gb, OrbitalElements el); |
|
|
|
|
|
|
|
|
|
|
|
grav_body |
|
|
|
GravBody |
|
|
|
gravBodyInit(double mu, double r); |
|
|
|
gravBodyInit(double mu, double r); |
|
|
|
|
|
|
|
|
|
|
|
ellipse_parameters |
|
|
|
EllipseParameters |
|
|
|
ellipseInitAB(double a, double b); |
|
|
|
ellipseInitAB(double a, double b); |
|
|
|
|
|
|
|
|
|
|
|
ellipse_parameters |
|
|
|
EllipseParameters |
|
|
|
ellipseInitAE(double a, double e); |
|
|
|
ellipseInitAE(double a, double e); |
|
|
|
|
|
|
|
|
|
|
|
bool |
|
|
|
bool |
|
|
|
ellipseValidate(const ellipse_parameters& ep); |
|
|
|
ellipseValidate(const EllipseParameters& ep); |
|
|
|
|
|
|
|
|
|
|
|
bool |
|
|
|
bool |
|
|
|
ellipsesEqual(ellipse_parameters& e1, ellipse_parameters& e2); |
|
|
|
ellipsesEqual(EllipseParameters& e1, EllipseParameters& e2); |
|
|
|
|
|
|
|
|
|
|
|
// NOTE: create vertices for a 3d ellipse
|
|
|
|
// NOTE: create vertices for a 3d ellipse
|
|
|
|
// NOTE: all vertices are in the x/y plane with z = 0
|
|
|
|
// NOTE: all vertices are in the x/y plane with z = 0
|
|
|
|
ellipse_3d |
|
|
|
Ellipse3D |
|
|
|
ellipseInit3D(ellipse_parameters ep, uint vert_count); |
|
|
|
ellipseInit3D(EllipseParameters ep, uint vert_count); |
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
void |
|
|
|
ellipse3DUpdate(ellipse_parameters ep, ellipse_3d& e3d); |
|
|
|
ellipse3DUpdate(EllipseParameters ep, Ellipse3D& e3d); |
|
|
|
|
|
|
|
|
|
|
|
orbital_elements |
|
|
|
OrbitalElements |
|
|
|
orbitInit(double a, double e); |
|
|
|
orbitInit(double a, double e); |
|
|
|
|
|
|
|
|
|
|
|
double |
|
|
|
double |
|
|
|
@ -109,7 +109,7 @@ double |
|
|
|
orbitGetPeriod(double a, double mu); |
|
|
|
orbitGetPeriod(double a, double mu); |
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
void |
|
|
|
orbitUpdate(orbital_elements& o, double a, double e); |
|
|
|
orbitUpdate(OrbitalElements& o, double a, double e); |
|
|
|
|
|
|
|
|
|
|
|
/* NOTE: how-to propagate orbit position given initial true anomaly, semimajor
|
|
|
|
/* NOTE: how-to propagate orbit position given initial true anomaly, semimajor
|
|
|
|
* axis, mean motion, and eccentricity: ref) section 4.4, Kepler's Problem, |
|
|
|
* axis, mean motion, and eccentricity: ref) section 4.4, Kepler's Problem, |
|
|
|
@ -146,7 +146,7 @@ orbitUpdate(orbital_elements& o, double a, double e); |
|
|
|
* tan(ϴ2/2) = sqrt((1+e) / (1-e)) * tan(E2/2) |
|
|
|
* tan(ϴ2/2) = sqrt((1+e) / (1-e)) * tan(E2/2) |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
double |
|
|
|
double |
|
|
|
getPropagatedTrueAnomaly(system_2body sys, |
|
|
|
getPropagatedTrueAnomaly(TwoBodySystem sys, |
|
|
|
double initial_anom, |
|
|
|
double initial_anom, |
|
|
|
double time_step); // NOTE: in seconds
|
|
|
|
double time_step); // NOTE: in seconds
|
|
|
|
|
|
|
|
|
|
|
|
@ -164,4 +164,4 @@ glm::vec2 |
|
|
|
polarToRect(double true_anom, double r); |
|
|
|
polarToRect(double true_anom, double r); |
|
|
|
|
|
|
|
|
|
|
|
double |
|
|
|
double |
|
|
|
orbitGetTimeOfFlight(system_2body sys, double theta_begin, double theta_end); |
|
|
|
orbitGetTimeOfFlight(TwoBodySystem sys, double theta_begin, double theta_end); |
|
|
|
|