Orbit.hpp   Orbit.hpp 
// orbit.h // orbit.h
// //
// Copyright (C) 2001, Chris Laurel <claurel@shatters.net> // Copyright (C) 2001, Chris Laurel <claurel@shatters.net>
// //
// CometOrbit: Copyright (C) 2007,2008 Johannes Gajdosik // CometOrbit: Copyright (C) 2007,2008 Johannes Gajdosik
// Amendments (c) 2013 Georg Zotti
// //
// This program is free software; you can redistribute it and/or // This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License // modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2 // as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version. // of the License, or (at your option) any later version.
#ifndef _ORBIT_HPP_ #ifndef _ORBIT_HPP_
#define _ORBIT_HPP_ #define _ORBIT_HPP_
#include "VecMath.hpp" #include "VecMath.hpp"
skipping to change at line 52 skipping to change at line 53
double parentRotObliquity, // = 0.0, double parentRotObliquity, // = 0.0,
double parentRotAscendingnode, // = 0.0 double parentRotAscendingnode, // = 0.0
double parentRotJ2000Longitude // = 0.0 double parentRotJ2000Longitude // = 0.0
); );
// Compute position for a specified Julian date and return coordinat es // Compute position for a specified Julian date and return coordinat es
// given in "dynamical equinox and ecliptic J2000" // given in "dynamical equinox and ecliptic J2000"
// which is the reference frame for VSOP87 // which is the reference frame for VSOP87
// In order to rotate to VSOP87 // In order to rotate to VSOP87
// parentRotObliquity and parentRotAscendingnode must be supplied. // parentRotObliquity and parentRotAscendingnode must be supplied.
void positionAtTimevInVSOP87Coordinates(double JD, double* v) const; void positionAtTimevInVSOP87Coordinates(const double JD, double* v) const;
// Original one // Original one
Vec3d positionAtTime(double) const; Vec3d positionAtTime(const double JD) const;
double getPeriod() const; double getPeriod() const;
double getBoundingRadius() const; double getBoundingRadius() const;
virtual void sample(double, double, int, OrbitSampleProc&) const; virtual void sample(double, double, int, OrbitSampleProc&) const;
private: private:
double eccentricAnomaly(double) const; //! returns eccentric anomaly E for Mean anomaly M
Vec3d positionAtE(double) const; double eccentricAnomaly(const double M) const;
Vec3d positionAtE(const double E) const;
double pericenterDistance; double pericenterDistance;
double eccentricity; double eccentricity;
double inclination; double inclination;
double ascendingNode; double ascendingNode;
double argOfPeriapsis; double argOfPeriapsis;
double meanAnomalyAtEpoch; double meanAnomalyAtEpoch;
double period; double period;
double epoch; double epoch;
double rotateToVsop87[9]; double rotateToVsop87[9];
}; };
class CometOrbit : public Orbit { class CometOrbit : public Orbit {
public: public:
CometOrbit(double pericenterDistance, CometOrbit(double pericenterDistance,
double eccentricity, double eccentricity,
double inclination, double inclination,
double ascendingNode, double ascendingNode,
double argOfPerhelion, double argOfPerhelion,
double timeAtPerihelion, double timeAtPerihelion,
double meanMotion, double orbitGoodDays,
double parentRotObliquity, double meanMotion, // GZ: for parabolics, this is
W/dt in Heafner's lettering
double parentRotObliquity, // Comets only have paren
t==sun, no need for these? Oh yes, VSOP/J2000 eq frames!
double parentRotAscendingnode, double parentRotAscendingnode,
double parentRotJ2000Longitude); double parentRotJ2000Longitude
);
// Compute the orbit for a specified Julian date and return a "stellari um compliant" function // Compute the orbit for a specified Julian date and return a "stellari um compliant" function
void positionAtTimevInVSOP87Coordinates(double JD, double* v) const; // GZ: new optional variable: updateSpeedVector, true required for dust
tail orientation!
void positionAtTimevInVSOP87Coordinates(double JD, double* v, bool update
VelocityVector=true);
// updating the tails is a bit expensive. try not to overdo it.
bool getUpdateTails() const {return updateTails;}
void setUpdateTails(const bool update){updateTails=update;}
Vec3d getVelocity() const {return rdot;} //! return speed value [AU/d] la
st computed by positionAtTimevInVSOP87Coordinates(JD, v, true)
bool objectDateValid(const double JD) const {return (fabs(t0-JD)<orbitGoo
d);}
private: private:
const double q; const double q; //! perihel distance
const double e; const double e; //! eccentricity
const double i; const double i; //! inclination
const double Om; const double Om; //! longitude of ascending node
const double o; const double w; //! argument of perihel // GZ RENAMED from o
const double t0; const double t0; //! time of perihel, JDE
const double n; const double n; //! mean motion (for parabolic orbits: W/dt in Heafner's
double rotateToVsop87[9]; presentation)
Vec3d rdot; //! GZ: velocity vector. Caches velocity from last posit
ion computation, [AU/d]
double rotateToVsop87[9]; //! Rotation matrix
bool updateTails; //! flag to signal that tails must be recomputed.
const double orbitGood; //! orb. elements are only valid for this time [d
ays]. Don't draw the object outside.
}; };
class OrbitSampleProc class OrbitSampleProc
{ {
public: public:
virtual ~OrbitSampleProc() {;} virtual ~OrbitSampleProc() {;}
virtual void sample(const Vec3d&) = 0; virtual void sample(const Vec3d&) = 0;
}; };
// Custom orbit classes should be derived from CachingOrbit. The custom // Custom orbit classes should be derived from CachingOrbit. The custom
// orbits can be expensive to compute, with more than 50 periodic terms. // orbits can be expensive to compute, with more than 50 periodic terms.
// Celestia may need require position of a Planet more than once per frame; in // Celestia may need require position of a Planet more than once per frame; in
// order to avoid redundant calculation, the CachingOrbit class saves the // order to avoid redundant calculation, the CachingOrbit class saves the
// result of the last calculation and uses it if the time matches the cache d // result of the last calculation and uses it if the time matches the cache d
// time. // time.
class CachingOrbit : public Orbit class CachingOrbit : public Orbit
{ {
public: public:
CachingOrbit() : lastTime(1.0e-30) {}; CachingOrbit() : lastTime(1.0e-30) {} //;
virtual Vec3d computePosition(double jd) const = 0; virtual Vec3d computePosition(double jd) const = 0;
virtual double getPeriod() const = 0; virtual double getPeriod() const = 0;
virtual double getBoundingRadius() const = 0; virtual double getBoundingRadius() const = 0;
Vec3d positionAtTime(double jd) const; Vec3d positionAtTime(double jd) const;
virtual void sample(double, double, int, OrbitSampleProc& proc) const; virtual void sample(double, double, int, OrbitSampleProc& proc) const;
private: private:
 End of changes. 9 change blocks. 
17 lines changed or deleted 39 lines changed or added

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/