00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef _ORBIT_HPP_
00013 #define _ORBIT_HPP_
00014
00015 #include "VecMath.hpp"
00016
00017 class OrbitSampleProc;
00018
00021 class Orbit
00022 {
00023 public:
00024 Orbit(void) {}
00025 virtual ~Orbit(void) {}
00026
00027
00028
00029
00030 private:
00031 Orbit(const Orbit&);
00032 const Orbit &operator=(const Orbit&);
00033 };
00034
00035
00036 class EllipticalOrbit : public Orbit
00037 {
00038 public:
00039 EllipticalOrbit(double pericenterDistance,
00040 double eccentricity,
00041 double inclination,
00042 double ascendingNode,
00043 double argOfPeriapsis,
00044 double meanAnomalyAtEpoch,
00045 double period,
00046 double epoch,
00047 double parentRotObliquity,
00048 double parentRotAscendingnode,
00049 double parentRotJ2000Longitude
00050 );
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 void positionAtTimevInVSOP87Coordinates(double JD, double* v) const;
00062
00063
00064 Vec3d positionAtTime(double) const;
00065 double getPeriod() const;
00066 double getBoundingRadius() const;
00067 virtual void sample(double, double, int, OrbitSampleProc&) const;
00068
00069 private:
00070 double eccentricAnomaly(double) const;
00071 Vec3d positionAtE(double) const;
00072
00073 double pericenterDistance;
00074 double eccentricity;
00075 double inclination;
00076 double ascendingNode;
00077 double argOfPeriapsis;
00078 double meanAnomalyAtEpoch;
00079 double period;
00080 double epoch;
00081 double rotateToVsop87[9];
00082 };
00083
00084
00085 class CometOrbit : public Orbit {
00086 public:
00087 CometOrbit(double pericenterDistance,
00088 double eccentricity,
00089 double inclination,
00090 double ascendingNode,
00091 double argOfPerhelion,
00092 double timeAtPerihelion,
00093 double meanMotion,
00094 double parentRotObliquity,
00095 double parentRotAscendingnode,
00096 double parentRotJ2000Longitude);
00097
00098
00099 void positionAtTimevInVSOP87Coordinates(double JD, double* v) const;
00100 private:
00101 const double q;
00102 const double e;
00103 const double i;
00104 const double Om;
00105 const double o;
00106 const double t0;
00107 const double n;
00108 double rotateToVsop87[9];
00109 };
00110
00111
00112 class OrbitSampleProc
00113 {
00114 public:
00115 virtual ~OrbitSampleProc() {;}
00116 virtual void sample(const Vec3d&) = 0;
00117 };
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127 class CachingOrbit : public Orbit
00128 {
00129 public:
00130 CachingOrbit() : lastTime(1.0e-30) {};
00131
00132 virtual Vec3d computePosition(double jd) const = 0;
00133 virtual double getPeriod() const = 0;
00134 virtual double getBoundingRadius() const = 0;
00135
00136 Vec3d positionAtTime(double jd) const;
00137
00138 virtual void sample(double, double, int, OrbitSampleProc& proc) const;
00139
00140 private:
00141 mutable Vec3d lastPosition;
00142 mutable double lastTime;
00143 };
00144
00145
00146
00147 #endif // _ORBIT_HPP_