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

OpenGL

开发平台:

Visual C++

  1. // frame.h
  2. // 
  3. // Copyright (C) 2003, 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_FRAME_H_
  10. #define _CELENGINE_FRAME_H_
  11. #include <celmath/vecmath.h>
  12. #include <celmath/quaternion.h>
  13. #include <celengine/astro.h>
  14. #include <celengine/selection.h>
  15. /*! A ReferenceFrame object has a center and set of orthogonal axes.
  16.  *
  17.  * Subclasses of ReferenceFrame must override the getOrientation method
  18.  * (which specifies the coordinate axes at a given time) and the
  19.  * nestingDepth() method (which is used to check for recursive frames.)
  20.  */
  21. class ReferenceFrame
  22. {
  23.  public:
  24.     ReferenceFrame(Selection center);
  25.     virtual ~ReferenceFrame() {};
  26.     int addRef() const;
  27.     int release() const;
  28.     
  29.     UniversalCoord convertFromUniversal(const UniversalCoord& uc, double tjd) const;
  30.     UniversalCoord convertToUniversal(const UniversalCoord& uc, double tjd) const;
  31.     Quatd convertFromUniversal(const Quatd& q, double tjd) const;
  32.     Quatd convertToUniversal(const Quatd& q, double tjd) const;
  33.     Point3d convertFromAstrocentric(const Point3d& p, double tjd) const;
  34.     Point3d convertToAstrocentric(const Point3d& p, double tjd) const;
  35.     
  36.     Selection getCenter() const;
  37.     virtual Quatd getOrientation(double tjd) const = 0;
  38. virtual Vec3d getAngularVelocity(double tdb) const;
  39. virtual bool isInertial() const = 0;
  40.     enum FrameType
  41.     {
  42.         PositionFrame = 1,
  43.         OrientationFrame = 2,
  44.     };
  45.     unsigned int nestingDepth(unsigned int maxDepth, FrameType) const;
  46.     virtual unsigned int nestingDepth(unsigned int depth,
  47.                                       unsigned int maxDepth,
  48.                                       FrameType frameType) const = 0;
  49.  private:
  50.     Selection centerObject;
  51.     mutable int refCount;
  52. };
  53. /*! Base class for complex frames where there may be some benefit
  54.  *  to caching the last calculated orientation.
  55.  */
  56. class CachingFrame : public ReferenceFrame
  57. {
  58.  public:
  59.     CachingFrame(Selection _center);
  60.     virtual ~CachingFrame() {};
  61.     Quatd getOrientation(double tjd) const;
  62. Vec3d getAngularVelocity(double tjd) const;
  63.     virtual Quatd computeOrientation(double tjd) const = 0;
  64. virtual Vec3d computeAngularVelocity(double tjd) const;
  65.  private:
  66.     mutable double lastTime;
  67.     mutable Quatd lastOrientation;
  68. mutable Vec3d lastAngularVelocity;
  69. mutable bool orientationCacheValid;
  70. mutable bool angularVelocityCacheValid;
  71. };
  72. //! J2000.0 Earth ecliptic frame
  73. class J2000EclipticFrame : public ReferenceFrame
  74. {
  75.  public:
  76.     J2000EclipticFrame(Selection center);
  77.     virtual ~J2000EclipticFrame() {};
  78.     Quatd getOrientation(double /* tjd */) const
  79.     {
  80.         return Quatd(1.0);
  81.     }
  82. virtual bool isInertial() const;
  83.     virtual unsigned int nestingDepth(unsigned int depth,
  84.                                       unsigned int maxDepth,
  85.                                       FrameType frameType) const;
  86. };
  87. //! J2000.0 Earth Mean Equator
  88. class J2000EquatorFrame : public ReferenceFrame
  89. {
  90.  public:
  91.     J2000EquatorFrame(Selection center);
  92.     virtual ~J2000EquatorFrame() {};
  93.     Quatd getOrientation(double tjd) const;
  94. virtual bool isInertial() const;
  95.     virtual unsigned int nestingDepth(unsigned int depth,
  96.                                       unsigned int maxDepth,
  97.                                       FrameType frameType) const;
  98. };
  99. /*! A BodyFixed frame is a coordinate system with the x-axis pointing
  100.  *  from the body center through the intersection of the prime meridian
  101.  *  and the equator, and the z-axis aligned with the north pole. The
  102.  *  y-axis is the cross product of x and z, and points toward the 90
  103.  *  meridian.
  104.  */
  105. class BodyFixedFrame : public ReferenceFrame
  106. {
  107.  public:
  108.     BodyFixedFrame(Selection center, Selection obj);
  109.     virtual ~BodyFixedFrame() {};
  110.     Quatd getOrientation(double tjd) const;
  111. virtual Vec3d getAngularVelocity(double tjd) const;
  112. virtual bool isInertial() const;
  113.     virtual unsigned int nestingDepth(unsigned int depth,
  114.                                       unsigned int maxDepth,
  115.                                       FrameType frameType) const;
  116.  private:
  117.     Selection fixObject;
  118. };
  119. class BodyMeanEquatorFrame : public ReferenceFrame
  120. {
  121.  public:
  122.     BodyMeanEquatorFrame(Selection center, Selection obj, double freeze);
  123.     BodyMeanEquatorFrame(Selection center, Selection obj);
  124.     virtual ~BodyMeanEquatorFrame() {};
  125.     Quatd getOrientation(double tjd) const;
  126. virtual Vec3d getAngularVelocity(double tjd) const;
  127. virtual bool isInertial() const;
  128.     virtual unsigned int nestingDepth(unsigned int depth,
  129.                                       unsigned int maxDepth,
  130.                                       FrameType frameType) const;
  131.  private:
  132.     Selection equatorObject;
  133.     double freezeEpoch;
  134.     bool isFrozen;
  135. };
  136. /*! FrameVectors are used to define the axes for TwoVector frames
  137.  */
  138. class FrameVector
  139. {
  140.  public:
  141.     FrameVector(const FrameVector& fv);
  142.     ~FrameVector();
  143.     FrameVector& operator=(const FrameVector&);
  144.     Vec3d direction(double tjd) const;
  145.     /*! Frames can be defined in reference to other frames; this method
  146.      *  counts the depth of such nesting, up to some specified maximum
  147.      *  level. This method is used to test for circular references in
  148.      *  frames.
  149.      */
  150.     unsigned int nestingDepth(unsigned int depth, unsigned int maxDepth) const;
  151.     enum FrameVectorType
  152.     {
  153.         RelativePosition,
  154.         RelativeVelocity,
  155.         ConstantVector,
  156.     };
  157.     
  158.     static FrameVector createRelativePositionVector(const Selection& _observer,
  159.                                                     const Selection& _target);
  160.     static FrameVector createRelativeVelocityVector(const Selection& _observer,
  161.                                                     const Selection& _target);
  162.     static FrameVector createConstantVector(const Vec3d& _vec,
  163.                                             const ReferenceFrame* _frame);
  164.  private:
  165.     /*! Type-only constructor is private. Code outside the class should
  166.      *  use create*Vector methods to create new FrameVectors.
  167.      */
  168.     FrameVector(FrameVectorType t);
  169.     FrameVectorType vecType;
  170.     Selection observer;
  171.     Selection target;
  172.     Vec3d vec;                   // constant vector
  173.     const ReferenceFrame* frame; // frame for constant vector
  174. };
  175. /*! A two vector frame is a coordinate system defined by a primary and
  176.  *  secondary vector. The primary axis points in the direction of the
  177.  *  primary vector. The secondary axis points in the direction of the
  178.  *  component of the secondary vector that is orthogonal to the primary
  179.  *  vector. The third axis is the cross product of the primary and
  180.  *  secondary axis.
  181.  */
  182. class TwoVectorFrame : public CachingFrame
  183. {
  184.  public:
  185.     /*! primAxis and secAxis are the labels of the axes defined by
  186.      *  the primary and secondary vectors:
  187.      *  1 = x, 2 = y, 3 = z, -1 = -x, -2 = -y, -3 = -z
  188.      */
  189.     TwoVectorFrame(Selection center, 
  190.                    const FrameVector& prim,
  191.                    int primAxis,
  192.                    const FrameVector& sec,
  193.                    int secAxis);
  194.     virtual ~TwoVectorFrame() {};
  195.     Quatd computeOrientation(double tjd) const;
  196. virtual bool isInertial() const;
  197.     virtual unsigned int nestingDepth(unsigned int depth,
  198.                                       unsigned int maxDepth,
  199.                                       FrameType frameType) const;
  200.     //! The sine of minimum angle between the primary and secondary vectors
  201.     static const double Tolerance;
  202.  private:
  203.     FrameVector primaryVector;
  204.     int primaryAxis;
  205.     FrameVector secondaryVector;
  206.     int secondaryAxis;
  207.     int tertiaryAxis;
  208. };
  209. #endif // _CELENGINE_FRAME_H_