Browse Source

update struct names to consistant PascalCase style

main
cinnaboot 4 years ago
parent
commit
4be3569771
  1. 22
      src/gooey.cpp
  2. 2
      src/gooey.h
  3. 13
      src/main.cpp
  4. 40
      src/orbits.cpp
  5. 50
      src/orbits.h
  6. 6
      tests/orbit_test.cpp

22
src/gooey.cpp

@ -42,18 +42,18 @@ gooProcessEvent(SDL_Event& e)
} }
void drawSimulationWindow(bool& running, u64 sim_time_ms, float& sim_speed); void drawSimulationWindow(bool& running, u64 sim_time_ms, float& sim_speed);
void drawEllipseParameters(ellipse_parameters& ep); void drawEllipseParameters(EllipseParameters& ep);
void drawGravitaationalBody(grav_body& body); void drawGravitaationalBody(GravBody& body);
void drawOrbitalElements(orbital_elements& el); void drawOrbitalElements(OrbitalElements& el);
void drawSatelliteWindow(satellite& sat); void drawSatelliteWindow(Satellite& sat);
void drawSystemWindow(system_2body& sys); void drawSystemWindow(TwoBodySystem& sys);
const static int G_WIDTH = 300; const static int G_WIDTH = 300;
const static ImVec2 V_SPACER(0, 10); const static ImVec2 V_SPACER(0, 10);
const int H_FLAGS = ImGuiTreeNodeFlags_DefaultOpen; const int H_FLAGS = ImGuiTreeNodeFlags_DefaultOpen;
void void
gooDraw(SDL_Window* window, system_2body& sys, gooDraw(SDL_Window* window, TwoBodySystem& sys,
bool& running, u64 sim_time_ms, float& sim_speed) bool& running, u64 sim_time_ms, float& sim_speed)
{ {
ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplOpenGL3_NewFrame();
@ -93,7 +93,7 @@ void drawSimulationWindow(bool& running, u64 sim_time_ms, float& sim_speed)
} }
} }
void drawEllipseParameters(ellipse_parameters& ep) void drawEllipseParameters(EllipseParameters& ep)
{ {
if (ImGui::CollapsingHeader("Ellipse Parameters:", H_FLAGS)) { if (ImGui::CollapsingHeader("Ellipse Parameters:", H_FLAGS)) {
ImGui::Text("semi_major axis, a: %f km", ep.a); ImGui::Text("semi_major axis, a: %f km", ep.a);
@ -105,7 +105,7 @@ void drawEllipseParameters(ellipse_parameters& ep)
} }
} }
void drawGravitaationalBody(grav_body& body) void drawGravitaationalBody(GravBody& body)
{ {
if (ImGui::CollapsingHeader("Gravitational Body:", H_FLAGS)) { if (ImGui::CollapsingHeader("Gravitational Body:", H_FLAGS)) {
ImGui::Text("mu, gravitational parameter: %f", body.mu); ImGui::Text("mu, gravitational parameter: %f", body.mu);
@ -114,7 +114,7 @@ void drawGravitaationalBody(grav_body& body)
} }
} }
void drawOrbitalElements(orbital_elements& el) void drawOrbitalElements(OrbitalElements& el)
{ {
if (ImGui::CollapsingHeader("Orbital Elements", H_FLAGS)) { if (ImGui::CollapsingHeader("Orbital Elements", H_FLAGS)) {
ImGui::Text("semi_major axis, a: %f km", el.a); ImGui::Text("semi_major axis, a: %f km", el.a);
@ -128,7 +128,7 @@ void drawOrbitalElements(orbital_elements& el)
} }
void void
drawSatelliteWindow(satellite& sat) drawSatelliteWindow(Satellite& sat)
{ {
if (ImGui::CollapsingHeader("Satellite:", H_FLAGS)) { if (ImGui::CollapsingHeader("Satellite:", H_FLAGS)) {
ImGui::Text("Satellite Parameters:"); ImGui::Text("Satellite Parameters:");
@ -144,7 +144,7 @@ drawSatelliteWindow(satellite& sat)
} }
} }
void drawSystemWindow(system_2body& sys) void drawSystemWindow(TwoBodySystem& sys)
{ {
if (ImGui::CollapsingHeader("2 Body System:", H_FLAGS)) { if (ImGui::CollapsingHeader("2 Body System:", H_FLAGS)) {
ImGui::Text("orbital period: %f", sys.orbital_period); ImGui::Text("orbital period: %f", sys.orbital_period);

2
src/gooey.h

@ -16,5 +16,5 @@ bool
gooProcessEvent(SDL_Event &e); gooProcessEvent(SDL_Event &e);
void void
gooDraw(SDL_Window* window, system_2body& sys, gooDraw(SDL_Window* window, TwoBodySystem& sys,
bool& running, u64 sim_time_ms, float& sim_speed); bool& running, u64 sim_time_ms, float& sim_speed);

13
src/main.cpp

@ -1,7 +1,6 @@
/* /*
* TODO: * TODO:
* - use consistant name style for structs) 'UpperCase'
* - make an 'overlay' graphic for things like apoapsis, perisapsis, f1, f2, * - make an 'overlay' graphic for things like apoapsis, perisapsis, f1, f2,
* flight path * flight path
* - impulsive orbital maneuvers * - impulsive orbital maneuvers
@ -38,7 +37,7 @@ struct GameState
u64 sim_time_ms; u64 sim_time_ms;
float sim_speed; float sim_speed;
system_2body system; // FIXME: we're going to need more than 1 system... TwoBodySystem system; // FIXME: we're going to need more than 1 system...
Entity* satellite_entity; Entity* satellite_entity;
}; };
@ -71,7 +70,7 @@ initLights(RenderState* rs)
Entity* Entity*
initEllipseEntity(RenderState* rs, initEllipseEntity(RenderState* rs,
system_2body* system, TwoBodySystem* system,
u32 num_vertices) u32 num_vertices)
{ {
system->e3d = ellipseInit3D(system->ep, num_vertices); system->e3d = ellipseInit3D(system->ep, num_vertices);
@ -181,8 +180,8 @@ loadScene(GameState* gs, RenderState* rs)
} }
void void
updateSatelliteModel(const system_2body& sys, updateSatelliteModel(const TwoBodySystem& sys,
satellite& sat, Satellite& sat,
double time_step) double time_step)
{ {
sat.theta = getPropagatedTrueAnomaly(sys, sat.theta, time_step); sat.theta = getPropagatedTrueAnomaly(sys, sat.theta, time_step);
@ -193,7 +192,7 @@ updateSatelliteModel(const system_2body& sys,
} }
void void
updateSatelliteEntity(Entity* e, const satellite& sat) updateSatelliteEntity(Entity* e, const Satellite& sat)
{ {
const static mat4 xform = const static mat4 xform =
glm::rotate(mat4(1.0), (float) M_PI_2, vec3(1, 0, 0)); glm::rotate(mat4(1.0), (float) M_PI_2, vec3(1, 0, 0));
@ -203,7 +202,7 @@ updateSatelliteEntity(Entity* e, const satellite& sat)
// NOTE: use ellipseValidate(ep) before calling to avoid failing assertions // NOTE: use ellipseValidate(ep) before calling to avoid failing assertions
void void
updateOrbit(system_2body sys, Entity& ellipse_entity) updateOrbit(TwoBodySystem sys, Entity& ellipse_entity)
{ {
#if 0 #if 0
ellipse3DUpdate(sys.ep, sys.e3d); ellipse3DUpdate(sys.ep, sys.e3d);

40
src/orbits.cpp

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

50
src/orbits.h

@ -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);

6
tests/orbit_test.cpp

@ -25,7 +25,7 @@ TEST_CASE("orbit propagation", "[orbits]")
double r = 6378; // body radius in km double r = 6378; // body radius in km
double initial_anom = 260 * M_PI / 180; // NOTE: radians double initial_anom = 260 * M_PI / 180; // NOTE: radians
double time_step = 60 * 50; // NOTE: seconds double time_step = 60 * 50; // NOTE: seconds
system_2body sys = systemInit(gravBodyInit(mu, r), orbitInit(a, e)); TwoBodySystem sys = systemInit(gravBodyInit(mu, r), orbitInit(a, e));
double E1 = getEccAnomFromTrueAnom(sys.ep.e, initial_anom); double E1 = getEccAnomFromTrueAnom(sys.ep.e, initial_anom);
REQUIRE_THAT(E1, WithinAbs(-0.8615, 1e-4)); REQUIRE_THAT(E1, WithinAbs(-0.8615, 1e-4));
@ -74,7 +74,7 @@ TEST_CASE("time of flight example 4.1 a", "[orbits]")
double e = 0.7411; // eccentricity double e = 0.7411; // eccentricity
double mu = 398601.68; // gravitational parameter double mu = 398601.68; // gravitational parameter
double r = 6378; // body radius in km double r = 6378; // body radius in km
system_2body sys = systemInit(gravBodyInit(mu, r), orbitInit(a, e)); TwoBodySystem sys = systemInit(gravBodyInit(mu, r), orbitInit(a, e));
// NOTE: get ToF from periapsis to true anomaly at 154.85 degrees // NOTE: get ToF from periapsis to true anomaly at 154.85 degrees
double theta_0 = 0.0; double theta_0 = 0.0;
@ -99,7 +99,7 @@ TEST_CASE("time of flight example 4.2", "[orbits]")
double e = 0.7411; // eccentricity double e = 0.7411; // eccentricity
double mu = 398601.68; // gravitational parameter double mu = 398601.68; // gravitational parameter
double r = 6378; // body radius in km double r = 6378; // body radius in km
system_2body sys = systemInit(gravBodyInit(mu, r), orbitInit(a, e)); TwoBodySystem sys = systemInit(gravBodyInit(mu, r), orbitInit(a, e));
// NOTE: get ToF from true anom 230 degrees to true anom at 120 degrees // NOTE: get ToF from true anom 230 degrees to true anom at 120 degrees
double theta_1 = 230 * M_PI / 180; double theta_1 = 230 * M_PI / 180;

Loading…
Cancel
Save