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));
}
// NOTE: use validateEllipse(orbit.ep) before calling to avoid failing
// NOTE: use ellipseValidate(orbit.ep) before calling to avoid failing
// assertions
void
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);
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)) {
// NOTE: handle the case where semimajor axis lowered with low
// 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.b = c_orb.ep.a * sqrt(1 - pow(c_orb.ep.e, 2.0));
}
if (validateEllipse(c_orb.ep)) {
c_orb.ep = constructEllipseAE(c_orb.ep.a, c_orb.ep.e);
if (ellipseValidate(c_orb.ep)) {
c_orb.ep = ellipseInitAE(c_orb.ep.a, c_orb.ep.e);
g_orbit.ep = c_orb.ep;
entity& ellipse_entity = rs->render_groups[0].entities[0];
updateOrbit(g_orbit, g_ellipse3d, ellipse_entity);
@ -185,7 +186,7 @@ main()
// NOTE: semi-major axis in km, eccentricity, gravitational parameter
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
shader_wrapper sw = { SIMPLE_SHADER, nullptr, rs->simple_shader };
@ -193,7 +194,7 @@ main()
rs->render_group_count = 1;
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));
entInitMesh(ellipse_entity, sm, GL_LINE_LOOP);
entRotate(ellipse_entity, (float) M_PI_2, glm::vec3(1, 0, 0));

12
src/orbits.cpp

@ -3,7 +3,7 @@
ellipse_parameters
constructEllipseAB(double a, double b)
ellipseInitAB(double a, double b)
{
assert(a > 0 && b > 0 && a >= b);
ellipse_parameters ep = { a, b };
@ -16,15 +16,15 @@ constructEllipseAB(double a, double b)
}
ellipse_parameters
constructEllipseAE(double a, double e)
ellipseInitAE(double a, double e)
{
assert(e >= 0 && e < 1);
double b = a * sqrt(1 - pow(e, 2.0));
return constructEllipseAB(a, b);
return ellipseInitAB(a, b);
}
bool
validateEllipse(const ellipse_parameters& ep)
ellipseValidate(const ellipse_parameters& ep)
{
// TODO: find out why satellite position gets wonky with orbit
// eccentricity > 0.995 while passing through true anom = 0.
@ -45,7 +45,7 @@ ellipsesEqual(ellipse_parameters& e1, ellipse_parameters& e2)
}
ellipse_3d
constructEllipse3D(ellipse_parameters ep, uint vert_count)
ellipseInit3D(ellipse_parameters ep, uint vert_count)
{
assert(ep.a > 0 && ep.b > 0 &&
ep.a >= ep.b &&
@ -70,7 +70,7 @@ orbitInit(double a, double e, double mu)
void
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.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
double v; // NOTE: velocity magnitute
double gamma; // NOTE: (γ) flight path angle
#endif
};
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;
glm::vec3* vertices;
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
constructEllipseAB(double a, double b);
ellipseInitAB(double a, double b);
ellipse_parameters
constructEllipseAE(double a, double e);
ellipseInitAE(double a, double e);
bool
validateEllipse(const ellipse_parameters& ep);
ellipseValidate(const ellipse_parameters& ep);
bool
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: all vertices are in the x/y plane with z = 0
ellipse_3d
constructEllipse3D(ellipse_parameters ep, uint vert_count);
ellipseInit3D(ellipse_parameters ep, uint vert_count);
void
ellipse3DUpdate(ellipse_parameters ep, ellipse_3d& e3d);

2
tests/orbit_test.cpp

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

Loading…
Cancel
Save