From fb1f93b825f679cf1e3d18e47960e8fee057a2e7 Mon Sep 17 00:00:00 2001 From: = <=> Date: Wed, 17 Mar 2021 15:41:58 -0400 Subject: [PATCH] add constructEllipseAE --- src/main.cpp | 10 +++------- src/orbits.cpp | 19 +++++++++++++++++-- src/orbits.h | 11 ++++++++++- tests/orbit_test.cpp | 4 +--- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 9625c15..be31a17 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -70,10 +70,8 @@ initOrbit() double a = 26564.5; // kilometers double e = 0.7411; - double b = a * sqrt(1 - pow(e, 2.0)); - orbit.ep = constructEllipse(a, b); + orbit.ep = constructEllipseAE(a, e); orbit.mu = 398601.68; // NOTE: earth's gravitational parameter in km^3/s^2 - return orbit; } @@ -94,9 +92,7 @@ doFrameCallbackPre(render_state* rs) rs->running = false; // update orbital elements/ellipse_3d - // TODO: could really use another ellipse constructor that uses a and e - g_orbit.ep = constructEllipseAB(g_orbit.ep.a, - g_orbit.ep.a * sqrt(1 - pow(g_orbit.ep.e, 2.0))); + g_orbit.ep = constructEllipseAE(g_orbit.ep.a, g_orbit.ep.e); entity& ellipse_entity = rs->render_groups[0].entities[0]; // TODO: fix this @@ -159,7 +155,7 @@ main() ); g_orbit = initOrbit(); - ellipse_parameters ep = constructEllipse(g_orbit.ep.a, g_orbit.ep.b); + ellipse_parameters ep = constructEllipseAB(g_orbit.ep.a, g_orbit.ep.b); // TODO: (renderer) this needs to be more convenient shader_wrapper sw = { SIMPLE_SHADER, nullptr, rs->simple_shader }; diff --git a/src/orbits.cpp b/src/orbits.cpp index 1fbf802..dc05ee0 100644 --- a/src/orbits.cpp +++ b/src/orbits.cpp @@ -3,7 +3,7 @@ ellipse_parameters -constructEllipse(double a, double b) +constructEllipseAB(double a, double b) { assert(a > 0 && b > 0 && a >= b); ellipse_parameters ep = { a, b }; @@ -12,7 +12,22 @@ constructEllipse(double a, double b) ep.p = ep.a * (1 - pow(ep.e, 2)); ep.f1.x = -1 * ep.c; ep.f2.x = ep.c; - return ep; } + return ep; +} + +ellipse_parameters +constructEllipseAE(double a, double e) +{ + assert(e >= 0 && e < 1); + double b = a * sqrt(1 - pow(e, 2.0)); + return constructEllipseAB(a, b); +} + +bool +validateEllipse(ellipse_parameters) +{ + return false; +} ellipse_3d constructEllipse3D(ellipse_parameters ep, uint vert_count) diff --git a/src/orbits.h b/src/orbits.h index 29c635b..c185d52 100644 --- a/src/orbits.h +++ b/src/orbits.h @@ -37,13 +37,22 @@ struct ellipse_3d ellipse_parameters -constructEllipse(double a, double b); +constructEllipseAB(double a, double b); + +ellipse_parameters +constructEllipseAE(double a, double e); + +bool +validateEllipse(ellipse_parameters); // NOTE: create vertices for a 3d ellipse // NOTE: all vertices are in the x/y plane with z = 0 ellipse_3d constructEllipse3D(ellipse_parameters ep, uint vert_count); +bool +ellipsesEqual(ellipse_parameters e1, ellipse_parameters e2); + /* NOTE: how-to propagate orbit position given initial true anomaly, semimajor * axis, mean motion, and eccentricity: ref) section 4.4, Kepler's Problem, * "Space Flight Dynamics" by Craig A. Kluever diff --git a/tests/orbit_test.cpp b/tests/orbit_test.cpp index 3d8eacc..7380b37 100644 --- a/tests/orbit_test.cpp +++ b/tests/orbit_test.cpp @@ -20,11 +20,9 @@ TEST_CASE("orbit construction", "[orbits]") TEST_CASE("orbit propagation", "[orbits]") { orbital_elements orbit = {}; - // TODO: might want another contructor for ellipse_parameters double a = 26564.5; // kilometers double e = 0.7411; - double b = a * sqrt(1 - pow(e, 2.0)); - ellipse_parameters ep = constructEllipse(a, b); + ellipse_parameters ep = constructEllipseAE(a, e); orbit.ep = ep; double initial_anom = 260 * M_PI / 180; // radians unsigned int time_step = 60 * 50; // seconds