orbit.h
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:6k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // orbit.h
  2. //
  3. // Copyright (C) 2001-2006, Chris Laurel <claurel@shatters.net>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #ifndef _CELENGINE_ORBIT_H_
  10. #define _CELENGINE_ORBIT_H_
  11. #include <celmath/vecmath.h>
  12. class OrbitSampleProc;
  13. class Orbit
  14. {
  15.  public:
  16.     virtual ~Orbit() {};
  17.     /*! Return the position in the orbit's reference frame at the specified
  18.      * time (TDB). Units are kilometers.
  19.      */
  20.     virtual Point3d positionAtTime(double jd) const = 0;
  21.     /*! Return the orbital velocity in the orbit's reference frame at the
  22.      * specified time (TDB). Units are kilometers per day. If the method
  23.  * is not overridden, the velocity will be computed by differentiation
  24.  * of position.
  25.      */
  26.     virtual Vec3d velocityAtTime(double) const;
  27.     virtual double getPeriod() const = 0;
  28.     virtual double getBoundingRadius() const = 0;
  29.     virtual void sample(double start, double t,
  30.                         int nSamples, OrbitSampleProc& proc) const = 0;
  31.     virtual bool isPeriodic() const { return true; };
  32.     // Return the time range over which the orbit is valid; if the orbit
  33.     // is always valid, begin and end should be equal.
  34.     virtual void getValidRange(double& begin, double& end) const
  35.         { begin = 0.0; end = 0.0; };
  36. };
  37. class EllipticalOrbit : public Orbit
  38. {
  39.  public:
  40.     EllipticalOrbit(double, double, double, double, double, double, double,
  41.                     double _epoch = 2451545.0);
  42.     virtual ~EllipticalOrbit() {};
  43.     // Compute the orbit for a specified Julian date
  44.     virtual Point3d positionAtTime(double) const;
  45.     virtual Vec3d velocityAtTime(double) const;
  46.     double getPeriod() const;
  47.     double getBoundingRadius() const;
  48.     virtual void sample(double, double, int, OrbitSampleProc&) const;
  49.  private:
  50.     double eccentricAnomaly(double) const;
  51.     Point3d positionAtE(double) const;
  52.     Vec3d velocityAtE(double) const;
  53.     double pericenterDistance;
  54.     double eccentricity;
  55.     double inclination;
  56.     double ascendingNode;
  57.     double argOfPeriapsis;
  58.     double meanAnomalyAtEpoch;
  59.     double period;
  60.     double epoch;
  61.     Mat3d orbitPlaneRotation;
  62. };
  63. class OrbitSampleProc
  64. {
  65.  public:
  66.     virtual ~OrbitSampleProc() {};
  67.     virtual void sample(double t, const Point3d&) = 0;
  68. };
  69. /*! Custom orbit classes should be derived from CachingOrbit.  The custom
  70.  * orbits can be expensive to compute, with more than 50 periodic terms.
  71.  * Celestia may need require position of a planet more than once per frame; in
  72.  * order to avoid redundant calculation, the CachingOrbit class saves the
  73.  * result of the last calculation and uses it if the time matches the cached
  74.  * time.
  75.  */
  76. class CachingOrbit : public Orbit
  77. {
  78.  public:
  79.     CachingOrbit();
  80.     virtual ~CachingOrbit();
  81.     virtual Point3d computePosition(double jd) const = 0;
  82.     virtual Vec3d computeVelocity(double jd) const;
  83.     virtual double getPeriod() const = 0;
  84.     virtual double getBoundingRadius() const = 0;
  85.     Point3d positionAtTime(double jd) const;
  86. Vec3d velocityAtTime(double jd) const;
  87.     virtual void sample(double, double, int, OrbitSampleProc& proc) const;
  88.  private:
  89.     mutable Point3d lastPosition;
  90. mutable Vec3d lastVelocity;
  91.     mutable double lastTime;
  92. mutable bool positionCacheValid;
  93. mutable bool velocityCacheValid;
  94. };
  95. /*! A mixed orbit is a composite orbit, typically used when you have a
  96.  *  custom orbit calculation that is only valid over limited span of time.
  97.  *  When a mixed orbit is constructed, it computes elliptical orbits
  98.  *  to approximate the behavior of the primary orbit before and after the
  99.  *  span over which it is valid.
  100.  */
  101. class MixedOrbit : public Orbit
  102. {
  103.  public:
  104.     MixedOrbit(Orbit* orbit, double t0, double t1, double mass);
  105.     virtual ~MixedOrbit();
  106.     virtual Point3d positionAtTime(double jd) const;
  107.     virtual Vec3d velocityAtTime(double jd) const;
  108.     virtual double getPeriod() const;
  109.     virtual double getBoundingRadius() const;
  110.     virtual void sample(double t0, double t1,
  111.                         int nSamples, OrbitSampleProc& proc) const;
  112.  private:
  113.     Orbit* primary;
  114.     EllipticalOrbit* afterApprox;
  115.     EllipticalOrbit* beforeApprox;
  116.     double begin;
  117.     double end;
  118.     double boundingRadius;
  119. };
  120. class Body;
  121. // TODO: eliminate this once body-fixed reference frames are implemented
  122. /*! An object in a synchronous orbit will always hover of the same spot on
  123.  *  the surface of the body it orbits.  Only equatorial orbits of a certain
  124.  *  radius are stable in the real world.  In Celestia, synchronous orbits are
  125.  *  a convenient way to fix objects to a planet surface.
  126.  */
  127. class SynchronousOrbit : public Orbit
  128. {
  129.  public:
  130.     SynchronousOrbit(const Body& _body, const Point3d& _position);
  131.     virtual ~SynchronousOrbit();
  132.     virtual Point3d positionAtTime(double jd) const;
  133.     virtual double getPeriod() const;
  134.     virtual double getBoundingRadius() const;
  135.     virtual void sample(double, double, int, OrbitSampleProc& proc) const;
  136.  private:
  137.     const Body& body;
  138.     Point3d position;
  139. };
  140. /*! A FixedOrbit is used for an object that remains at a constant
  141.  *  position within its reference frame.
  142.  */
  143. class FixedOrbit : public Orbit
  144. {
  145.  public:
  146.     FixedOrbit(const Point3d& pos);
  147.     virtual ~FixedOrbit();
  148.     virtual Point3d positionAtTime(double) const;
  149.     //virtual Vec3d velocityAtTime(double) const;
  150.     virtual double getPeriod() const;
  151.     virtual bool isPeriodic() const;
  152.     virtual double getBoundingRadius() const;
  153.     virtual void sample(double, double, int, OrbitSampleProc&) const;
  154.  private:
  155.     Point3d position;
  156. };
  157. #endif // _CELENGINE_ORBIT_H_