Pioneer
Orbit.h
Go to the documentation of this file.
1 // Copyright © 2008-2023 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 #ifndef ORBIT_H
5 #define ORBIT_H
6 
7 #include "libs.h"
8 #include "matrix3x3.h"
9 #include "vector3.h"
10 
11 class Orbit {
12 public:
13  // utility functions for simple calculations
14  static double OrbitalPeriod(double semiMajorAxis, double centralMass);
15  static double OrbitalPeriodTwoBody(double semiMajorAxis, double totalMass, double bodyMass);
16 
17  // note: the resulting Orbit is at the given position at t=0
18  static Orbit FromBodyState(const vector3d &position, const vector3d &velocity, double central_mass);
19  static Orbit ForStaticBody(const vector3d &position);
20 
21  Orbit() :
22  m_eccentricity(0.0),
23  m_semiMajorAxis(0.0),
24  m_orbitalPhaseAtStart(0.0),
25  m_velocityAreaPerSecond(0.0),
26  m_orient(matrix3x3d::Identity())
27  {}
28 
29  void SetShapeAroundBarycentre(double semiMajorAxis, double totalMass, double bodyMass, double eccentricity);
30  void SetShapeAroundPrimary(double semiMajorAxis, double totalMass, double eccentricity);
31  void SetPlane(const matrix3x3d &orient)
32  {
33  m_orient = orient;
34  assert(!std::isnan(m_orient[0]) && !std::isnan(m_orient[1]) && !std::isnan(m_orient[2]));
35  assert(!std::isnan(m_orient[3]) && !std::isnan(m_orient[4]) && !std::isnan(m_orient[5]));
36  assert(!std::isnan(m_orient[6]) && !std::isnan(m_orient[7]) && !std::isnan(m_orient[8]));
37  }
38  void SetPhase(double orbitalPhaseAtStart) { m_orbitalPhaseAtStart = orbitalPhaseAtStart; }
39 
40  vector3d OrbitalPosAtTime(double t) const;
41  double OrbitalTimeAtPos(const vector3d &pos, double centralMass) const;
42  vector3d OrbitalVelocityAtTime(double totalMass, double t) const;
43 
44  // 0.0 <= t <= 1.0. Not for finding orbital pos
45  vector3d EvenSpacedPosTrajectory(double t, double timeOffset = 0) const;
46 
47  double Period() const;
48  vector3d Apogeum() const;
49  vector3d Perigeum() const;
50 
51  // basic accessors
52  double GetEccentricity() const { return m_eccentricity; }
53  double GetSemiMajorAxis() const { return m_semiMajorAxis; }
54  double GetOrbitalPhaseAtStart() const { return m_orbitalPhaseAtStart; }
55  const matrix3x3d &GetPlane() const { return m_orient; }
56 
57 private:
58  double TrueAnomalyFromMeanAnomaly(double MeanAnomaly) const;
59  double MeanAnomalyFromTrueAnomaly(double trueAnomaly) const;
60  double MeanAnomalyAtTime(double time) const;
61 
62  vector3d m_positionForStaticBody;
63  double m_eccentricity;
64  double m_semiMajorAxis;
65  double m_orbitalPhaseAtStart; // 0 to 2 pi radians
66  /* dup " " --------------------------------------- */
67  double m_velocityAreaPerSecond; // seconds
68  matrix3x3d m_orient;
69 };
70 
71 #endif
Definition: Orbit.h:11
static double OrbitalPeriodTwoBody(double semiMajorAxis, double totalMass, double bodyMass)
Definition: Orbit.cpp:17
double OrbitalTimeAtPos(const vector3d &pos, double centralMass) const
Definition: Orbit.cpp:175
Orbit()
Definition: Orbit.h:21
static Orbit ForStaticBody(const vector3d &position)
Definition: Orbit.cpp:302
vector3d Perigeum() const
Definition: Orbit.cpp:279
double Period() const
Definition: Orbit.cpp:260
vector3d OrbitalVelocityAtTime(double totalMass, double t) const
Definition: Orbit.cpp:214
const matrix3x3d & GetPlane() const
Definition: Orbit.h:55
double GetOrbitalPhaseAtStart() const
Definition: Orbit.h:54
vector3d EvenSpacedPosTrajectory(double t, double timeOffset=0) const
Definition: Orbit.cpp:234
vector3d Apogeum() const
Definition: Orbit.cpp:270
void SetPhase(double orbitalPhaseAtStart)
Definition: Orbit.h:38
vector3d OrbitalPosAtTime(double t) const
Definition: Orbit.cpp:167
void SetShapeAroundBarycentre(double semiMajorAxis, double totalMass, double bodyMass, double eccentricity)
Definition: Orbit.cpp:288
void SetShapeAroundPrimary(double semiMajorAxis, double totalMass, double eccentricity)
Definition: Orbit.cpp:295
static Orbit FromBodyState(const vector3d &position, const vector3d &velocity, double central_mass)
Definition: Orbit.cpp:310
double GetEccentricity() const
Definition: Orbit.h:52
double GetSemiMajorAxis() const
Definition: Orbit.h:53
void SetPlane(const matrix3x3d &orient)
Definition: Orbit.h:31
static double OrbitalPeriod(double semiMajorAxis, double centralMass)
Definition: Orbit.cpp:12