pioneer/src/Orbit.h

72 lines
2.5 KiB
C++

// Copyright © 2008-2021 Pioneer Developers. See AUTHORS.txt for details
// Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
#ifndef ORBIT_H
#define ORBIT_H
#include "libs.h"
#include "matrix3x3.h"
#include "vector3.h"
class Orbit {
public:
// utility functions for simple calculations
static double OrbitalPeriod(double semiMajorAxis, double centralMass);
static double OrbitalPeriodTwoBody(double semiMajorAxis, double totalMass, double bodyMass);
// note: the resulting Orbit is at the given position at t=0
static Orbit FromBodyState(const vector3d &position, const vector3d &velocity, double central_mass);
static Orbit ForStaticBody(const vector3d &position);
Orbit() :
m_eccentricity(0.0),
m_semiMajorAxis(0.0),
m_orbitalPhaseAtStart(0.0),
m_velocityAreaPerSecond(0.0),
m_orient(matrix3x3d::Identity())
{}
void SetShapeAroundBarycentre(double semiMajorAxis, double totalMass, double bodyMass, double eccentricity);
void SetShapeAroundPrimary(double semiMajorAxis, double totalMass, double eccentricity);
void SetPlane(const matrix3x3d &orient)
{
m_orient = orient;
assert(!std::isnan(m_orient[0]) && !std::isnan(m_orient[1]) && !std::isnan(m_orient[2]));
assert(!std::isnan(m_orient[3]) && !std::isnan(m_orient[4]) && !std::isnan(m_orient[5]));
assert(!std::isnan(m_orient[6]) && !std::isnan(m_orient[7]) && !std::isnan(m_orient[8]));
}
void SetPhase(double orbitalPhaseAtStart) { m_orbitalPhaseAtStart = orbitalPhaseAtStart; }
vector3d OrbitalPosAtTime(double t) const;
double OrbitalTimeAtPos(const vector3d &pos, double centralMass) const;
vector3d OrbitalVelocityAtTime(double totalMass, double t) const;
// 0.0 <= t <= 1.0. Not for finding orbital pos
vector3d EvenSpacedPosTrajectory(double t, double timeOffset = 0) const;
double Period() const;
vector3d Apogeum() const;
vector3d Perigeum() const;
// basic accessors
double GetEccentricity() const { return m_eccentricity; }
double GetSemiMajorAxis() const { return m_semiMajorAxis; }
double GetOrbitalPhaseAtStart() const { return m_orbitalPhaseAtStart; }
const matrix3x3d &GetPlane() const { return m_orient; }
private:
double TrueAnomalyFromMeanAnomaly(double MeanAnomaly) const;
double MeanAnomalyFromTrueAnomaly(double trueAnomaly) const;
double MeanAnomalyAtTime(double time) const;
vector3d m_positionForStaticBody;
double m_eccentricity;
double m_semiMajorAxis;
double m_orbitalPhaseAtStart; // 0 to 2 pi radians
/* dup " " --------------------------------------- */
double m_velocityAreaPerSecond; // seconds
matrix3x3d m_orient;
};
#endif