Browse Source

update function names in orbit.h to be consistent with style

main
cinnaboot 5 years ago
parent
commit
5c45c2d6cd
  1. 15
      src/main.cpp
  2. 12
      src/orbits.cpp
  3. 43
      src/orbits.h
  4. 2
      tests/orbit_test.cpp

15
src/main.cpp

@ -79,12 +79,12 @@ updateSatellitePosition(entity& satellite)
entSetWorldPosition(satellite, xform * glm::vec4(v.x, v.y, v.z, 1)); entSetWorldPosition(satellite, xform * glm::vec4(v.x, v.y, v.z, 1));
} }
// NOTE: use validateEllipse(orbit.ep) before calling to avoid failing // NOTE: use ellipseValidate(orbit.ep) before calling to avoid failing
// assertions // assertions
void void
updateOrbit(orbital_elements& orbit, ellipse_3d& e3d, entity& ellipse_entity) updateOrbit(orbital_elements& orbit, ellipse_3d& e3d, entity& ellipse_entity)
{ {
orbit.ep = constructEllipseAE(orbit.ep.a, orbit.ep.e); orbit.ep = ellipseInitAE(orbit.ep.a, orbit.ep.e);
ellipse3DUpdate(orbit.ep, e3d); ellipse3DUpdate(orbit.ep, e3d);
for (uint i = 0; i < e3d.vert_count; i++) for (uint i = 0; i < e3d.vert_count; i++)
@ -133,14 +133,15 @@ postFrameCallback(render_state* rs)
if (!ellipsesEqual(c_orb.ep, g_orbit.ep)) { if (!ellipsesEqual(c_orb.ep, g_orbit.ep)) {
// NOTE: handle the case where semimajor axis lowered with low // NOTE: handle the case where semimajor axis lowered with low
// eccentricity would fail validation // eccentricity would fail validation
if (c_orb.ep.a < g_orbit.ep.a && c_orb.ep.a > 0 if (c_orb.ep.a < g_orbit.ep.a
&& c_orb.ep.a > 0
&& c_orb.ep.e == g_orbit.ep.e) && c_orb.ep.e == g_orbit.ep.e)
{ {
c_orb.ep.b = c_orb.ep.a * sqrt(1 - pow(c_orb.ep.e, 2.0)); c_orb.ep.b = c_orb.ep.a * sqrt(1 - pow(c_orb.ep.e, 2.0));
} }
if (validateEllipse(c_orb.ep)) { if (ellipseValidate(c_orb.ep)) {
c_orb.ep = constructEllipseAE(c_orb.ep.a, c_orb.ep.e); c_orb.ep = ellipseInitAE(c_orb.ep.a, c_orb.ep.e);
g_orbit.ep = c_orb.ep; g_orbit.ep = c_orb.ep;
entity& ellipse_entity = rs->render_groups[0].entities[0]; entity& ellipse_entity = rs->render_groups[0].entities[0];
updateOrbit(g_orbit, g_ellipse3d, ellipse_entity); updateOrbit(g_orbit, g_ellipse3d, ellipse_entity);
@ -185,7 +186,7 @@ main()
// NOTE: semi-major axis in km, eccentricity, gravitational parameter // NOTE: semi-major axis in km, eccentricity, gravitational parameter
g_orbit = orbitInit(26564.5, 0.7411, 398601.68); g_orbit = orbitInit(26564.5, 0.7411, 398601.68);
ellipse_parameters ep = constructEllipseAB(g_orbit.ep.a, g_orbit.ep.b); ellipse_parameters ep = ellipseInitAB(g_orbit.ep.a, g_orbit.ep.b);
// TODO: (renderer) this needs to be more convenient // TODO: (renderer) this needs to be more convenient
shader_wrapper sw = { SIMPLE_SHADER, nullptr, rs->simple_shader }; shader_wrapper sw = { SIMPLE_SHADER, nullptr, rs->simple_shader };
@ -193,7 +194,7 @@ main()
rs->render_group_count = 1; rs->render_group_count = 1;
entity& ellipse_entity = rs->render_groups[0].entities[0]; entity& ellipse_entity = rs->render_groups[0].entities[0];
g_ellipse3d = constructEllipse3D(ep, 256); g_ellipse3d = ellipseInit3D(ep, 256);
simple_mesh* sm = constructEllipseMesh(g_ellipse3d, glm::vec3(255, 0, 255)); simple_mesh* sm = constructEllipseMesh(g_ellipse3d, glm::vec3(255, 0, 255));
entInitMesh(ellipse_entity, sm, GL_LINE_LOOP); entInitMesh(ellipse_entity, sm, GL_LINE_LOOP);
entRotate(ellipse_entity, (float) M_PI_2, glm::vec3(1, 0, 0)); entRotate(ellipse_entity, (float) M_PI_2, glm::vec3(1, 0, 0));

12
src/orbits.cpp

@ -3,7 +3,7 @@
ellipse_parameters ellipse_parameters
constructEllipseAB(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 }; ellipse_parameters ep = { a, b };
@ -16,15 +16,15 @@ constructEllipseAB(double a, double b)
} }
ellipse_parameters ellipse_parameters
constructEllipseAE(double a, double e) ellipseInitAE(double a, double e)
{ {
assert(e >= 0 && e < 1); assert(e >= 0 && e < 1);
double b = a * sqrt(1 - pow(e, 2.0)); double b = a * sqrt(1 - pow(e, 2.0));
return constructEllipseAB(a, b); return ellipseInitAB(a, b);
} }
bool bool
validateEllipse(const ellipse_parameters& ep) ellipseValidate(const ellipse_parameters& 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.
@ -45,7 +45,7 @@ ellipsesEqual(ellipse_parameters& e1, ellipse_parameters& e2)
} }
ellipse_3d ellipse_3d
constructEllipse3D(ellipse_parameters ep, uint vert_count) ellipseInit3D(ellipse_parameters 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 &&
@ -70,7 +70,7 @@ orbitInit(double a, double e, double mu)
void void
orbitUpdate(orbital_elements& o, double a, double e) orbitUpdate(orbital_elements& o, double a, double e)
{ {
o.ep = constructEllipseAE(a, e); o.ep = ellipseInitAE(a, e);
o.epsilon = orbitGetSpecificEnergy(o.ep.a, o.mu); o.epsilon = orbitGetSpecificEnergy(o.ep.a, o.mu);
o.h = orbitGetAngularMomentum(o.ep.p, o.mu); o.h = orbitGetAngularMomentum(o.ep.p, o.mu);
} }

43
src/orbits.h

@ -34,24 +34,59 @@ struct orbital_elements
glm::vec3 pos; // NOTE: true anomaly in 3d with ep.f2 at origin glm::vec3 pos; // NOTE: true anomaly in 3d with ep.f2 at origin
double v; // NOTE: velocity magnitute double v; // NOTE: velocity magnitute
double gamma; // NOTE: (γ) flight path angle double gamma; // NOTE: (γ) flight path angle
#endif
}; };
struct ellipse_3d struct ellipse_3d
{ {
// TODO: would be better to have a higher level composite object so we
// don't have to store this twice
ellipse_parameters ep; ellipse_parameters ep;
glm::vec3* vertices; glm::vec3* vertices;
uint vert_count; uint vert_count;
}; };
struct gravitational_body
{
double mu; // NOTE: (μ) gravitational parameter
double radius; // NOTE: radius of ideal sphere representing the body
// double r_atmos; // TODO: bodies w/ atmosphere
};
struct satellite
{
glm::vec3 position;
glm::vec3 velocity;
// double theta; // NOTE: true anomaly
// double r; // NOTE: radius magnitude
// double gamma; // NOTE: (γ) flight path angle
// double v; // NOTE: velocity magnitute
};
// NOTE: top level composite for 2 body system
struct system
{
gravitational_body grav_body;
satellite sat;
//ellipse_parameters ep;
ellipse_3d e3d;
orbital_elements elements;
double epsilon; // NOTE: (ε) specific orbital energy, MJ/kg
double h; // NOTE: angular momentum
double r_apoapsis; // NOTE: apoapse distance from body center
double r_periapsis; // NOTE: periapsis distance from body center
};
ellipse_parameters ellipse_parameters
constructEllipseAB(double a, double b); ellipseInitAB(double a, double b);
ellipse_parameters ellipse_parameters
constructEllipseAE(double a, double e); ellipseInitAE(double a, double e);
bool bool
validateEllipse(const ellipse_parameters& ep); ellipseValidate(const ellipse_parameters& ep);
bool bool
ellipsesEqual(ellipse_parameters& e1, ellipse_parameters& e2); ellipsesEqual(ellipse_parameters& e1, ellipse_parameters& e2);
@ -59,7 +94,7 @@ ellipsesEqual(ellipse_parameters& e1, ellipse_parameters& 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 ellipse_3d
constructEllipse3D(ellipse_parameters ep, uint vert_count); ellipseInit3D(ellipse_parameters ep, uint vert_count);
void void
ellipse3DUpdate(ellipse_parameters ep, ellipse_3d& e3d); ellipse3DUpdate(ellipse_parameters ep, ellipse_3d& e3d);

2
tests/orbit_test.cpp

@ -22,7 +22,7 @@ TEST_CASE("orbit propagation", "[orbits]")
orbital_elements orbit = {}; orbital_elements orbit = {};
double a = 26564.5; // kilometers double a = 26564.5; // kilometers
double e = 0.7411; double e = 0.7411;
ellipse_parameters ep = constructEllipseAE(a, e); ellipse_parameters ep = ellipseInitAE(a, e);
orbit.ep = ep; orbit.ep = ep;
double initial_anom = 260 * M_PI / 180; // radians double initial_anom = 260 * M_PI / 180; // radians
unsigned int time_step = 60 * 50; // seconds unsigned int time_step = 60 * 50; // seconds

Loading…
Cancel
Save