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 drawEllipseParameters(ellipse_parameters& ep);
void drawGravitaationalBody(grav_body& body);
void drawOrbitalElements(orbital_elements& el);
void drawSatelliteWindow(satellite& sat);
void drawSystemWindow(system_2body& sys);
void drawEllipseParameters(EllipseParameters& ep);
void drawGravitaationalBody(GravBody& body);
void drawOrbitalElements(OrbitalElements& el);
void drawSatelliteWindow(Satellite& sat);
void drawSystemWindow(TwoBodySystem& sys);
const static int G_WIDTH = 300;
const static ImVec2 V_SPACER(0, 10);
const int H_FLAGS = ImGuiTreeNodeFlags_DefaultOpen;
void
gooDraw(SDL_Window* window, system_2body& sys,
gooDraw(SDL_Window* window, TwoBodySystem& sys,
bool& running, u64 sim_time_ms, float& sim_speed)
{
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)) {
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)) {
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)) {
ImGui::Text("semi_major axis, a: %f km", el.a);
@ -128,7 +128,7 @@ void drawOrbitalElements(orbital_elements& el)
}
void
drawSatelliteWindow(satellite& sat)
drawSatelliteWindow(Satellite& sat)
{
if (ImGui::CollapsingHeader("Satellite:", H_FLAGS)) {
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)) {
ImGui::Text("orbital period: %f", sys.orbital_period);

2
src/gooey.h

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

13
src/main.cpp

@ -1,7 +1,6 @@
/*
* TODO:
* - use consistant name style for structs) 'UpperCase'
* - make an 'overlay' graphic for things like apoapsis, perisapsis, f1, f2,
* flight path
* - impulsive orbital maneuvers
@ -38,7 +37,7 @@ struct GameState
u64 sim_time_ms;
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;
};
@ -71,7 +70,7 @@ initLights(RenderState* rs)
Entity*
initEllipseEntity(RenderState* rs,
system_2body* system,
TwoBodySystem* system,
u32 num_vertices)
{
system->e3d = ellipseInit3D(system->ep, num_vertices);
@ -181,8 +180,8 @@ loadScene(GameState* gs, RenderState* rs)
}
void
updateSatelliteModel(const system_2body& sys,
satellite& sat,
updateSatelliteModel(const TwoBodySystem& sys,
Satellite& sat,
double time_step)
{
sat.theta = getPropagatedTrueAnomaly(sys, sat.theta, time_step);
@ -193,7 +192,7 @@ updateSatelliteModel(const system_2body& sys,
}
void
updateSatelliteEntity(Entity* e, const satellite& sat)
updateSatelliteEntity(Entity* e, const Satellite& sat)
{
const static mat4 xform =
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
void
updateOrbit(system_2body sys, Entity& ellipse_entity)
updateOrbit(TwoBodySystem sys, Entity& ellipse_entity)
{
#if 0
ellipse3DUpdate(sys.ep, sys.e3d);

40
src/orbits.cpp

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

50
src/orbits.h

@ -8,7 +8,7 @@
#include "util.h"
struct ellipse_parameters
struct EllipseParameters
{
double a; // NOTE: semi-major axis
double b; // NOTE: semi-minor axis
@ -19,7 +19,7 @@ struct ellipse_parameters
glm::vec2 f2; // NOTE: 'vacant' focus
};
struct orbital_elements
struct OrbitalElements
{
// NOTE: classical orbital elements
double a; // NOTE: semimajor axis
@ -30,20 +30,20 @@ struct orbital_elements
double nu; // NOTE: (ν) true anomaly at T0
};
struct ellipse_3d
struct Ellipse3D
{
glm::vec3* vertices;
uint vert_count;
};
struct grav_body
struct GravBody
{
double mu; // NOTE: (μ) gravitational parameter
double radius; // NOTE: radius of ideal sphere representing the body
// double r_atmos; // TODO: bodies w/ atmosphere
};
struct satellite
struct Satellite
{
glm::vec3 position;
glm::vec3 velocity;
@ -54,13 +54,13 @@ struct satellite
};
// NOTE: top level composite for 2 body system
struct system_2body
struct TwoBodySystem
{
grav_body body;
satellite sat;
ellipse_parameters ep;
ellipse_3d e3d;
orbital_elements elements;
GravBody body;
Satellite sat;
EllipseParameters ep;
Ellipse3D e3d;
OrbitalElements elements;
double epsilon; // NOTE: (ε) specific orbital energy, MJ/kg
double h; // NOTE: angular momentum
@ -70,33 +70,33 @@ struct system_2body
};
system_2body
systemInit(grav_body gb, orbital_elements el);
TwoBodySystem
systemInit(GravBody gb, OrbitalElements el);
grav_body
GravBody
gravBodyInit(double mu, double r);
ellipse_parameters
EllipseParameters
ellipseInitAB(double a, double b);
ellipse_parameters
EllipseParameters
ellipseInitAE(double a, double e);
bool
ellipseValidate(const ellipse_parameters& ep);
ellipseValidate(const EllipseParameters& ep);
bool
ellipsesEqual(ellipse_parameters& e1, ellipse_parameters& e2);
ellipsesEqual(EllipseParameters& e1, EllipseParameters& e2);
// NOTE: create vertices for a 3d ellipse
// NOTE: all vertices are in the x/y plane with z = 0
ellipse_3d
ellipseInit3D(ellipse_parameters ep, uint vert_count);
Ellipse3D
ellipseInit3D(EllipseParameters ep, uint vert_count);
void
ellipse3DUpdate(ellipse_parameters ep, ellipse_3d& e3d);
ellipse3DUpdate(EllipseParameters ep, Ellipse3D& e3d);
orbital_elements
OrbitalElements
orbitInit(double a, double e);
double
@ -109,7 +109,7 @@ double
orbitGetPeriod(double a, double mu);
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
* 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)
*/
double
getPropagatedTrueAnomaly(system_2body sys,
getPropagatedTrueAnomaly(TwoBodySystem sys,
double initial_anom,
double time_step); // NOTE: in seconds
@ -164,4 +164,4 @@ glm::vec2
polarToRect(double true_anom, double r);
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 initial_anom = 260 * M_PI / 180; // NOTE: radians
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);
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 mu = 398601.68; // gravitational parameter
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
double theta_0 = 0.0;
@ -99,7 +99,7 @@ TEST_CASE("time of flight example 4.2", "[orbits]")
double e = 0.7411; // eccentricity
double mu = 398601.68; // gravitational parameter
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
double theta_1 = 230 * M_PI / 180;

Loading…
Cancel
Save