00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef __SO3_ASTRONOMY_H__
00036 #define __SO3_ASTRONOMY_H__
00037
00038 #include "../SCOLBasic/SO3Std.h"
00039
00040 namespace SO3
00041 {
00042
00051 class _SO3_Export SAstronomy
00052 {
00053 public:
00054 static const double J2000;
00055 protected:
00056 private:
00057 static const double PI;
00058
00059 public:
00064 static double NormalizeDegrees(double x);
00065
00069 static double RadToDeg(double x);
00070
00074 static double DegToRad(double x);
00075
00078 static double SinDeg(double x);
00079
00082 static double CosDeg(double x);
00083
00086 static double Atan2Deg (double y, double x);
00087
00096 static void ConvertEclipticToEquatorialRad(double lon, double lat, double& rasc, double& decl);
00097
00100 static void ConvertRectangularToSpherical(double x, double y, double z, double& rasc, double& decl, double& dist);
00101
00104 static void ConvertSphericalToRectangular(double rasc, double decl, double dist, double& x, double& y, double& z);
00105
00117 static void ConvertEquatorialToHorizontal(double jday, double longitude, double latitude, double rasc, double decl, double& azimuth, double& altitude);
00118
00121 static void GetEclipticSunPosition(double jday, double& lambda, double& beta);
00122
00125 static void GetEquatorialSunPosition(double jday, double& sunRightAscension, double& sunDeclinaison);
00126
00135 static void GetHorizontalSunPosition(double jday, double longitude, double latitude, double& azimuth, double& altitude);
00136
00139 static void GetHorizontalSunPosition(double jday, Ogre::Degree longitude, Ogre::Degree latitude, Ogre::Degree& azimuth, Ogre::Degree& altitude);
00140
00146 static void GetEclipticMoonPositionRad(double jday, double& lon, double& lat);
00147
00150 static void GetHorizontalMoonPosition(double jday, double longitude, double latitude, double& azimuth, double& altitude);
00151
00154 static void GetHorizontalMoonPosition(double jday, Ogre::Degree longitude, Ogre::Degree latitude, Ogre::Degree& azimuth, Ogre::Degree& altitude);
00155
00159 static void GetMoonPhase(double jday, float& moonPhase);
00160
00166 static int GetJulianDayFromGregorianDate(int year, int month, int day);
00167
00174 static double GetJulianDayFromGregorianDateTime(int year, int month, int day, int hour, int minute, double second);
00175
00179 static double GetJulianDayFromGregorianDateTime(int year, int month, int day, double secondsFromMidnight);
00180
00184 static void GetGregorianDateFromJulianDay(int julianDay, int& year, int& month, int& day);
00185
00189 static void GetGregorianDateTimeFromJulianDay(double julianDay, int& year, int& month, int& day, int& hour, int& minute, double& second);
00190
00194 static void GetGregorianDateFromJulianDay(double julianDay, int& year, int& month, int& day);
00195
00206 static int EnterHighPrecissionFloatingPointMode();
00207
00208
00209
00210
00211
00212 static void RestoreFloatingPointMode(int oldMode);
00213
00216 static void GetEclipticSunMeanLongitude(double jday, double& sunlon);
00217 protected:
00218 private:
00222 SAstronomy();
00223 };
00224
00232 class ScopedHighPrecissionFloatSwitch
00233 {
00234 public:
00235 protected:
00236 private:
00237 int mOldFpMode;
00238
00239 public:
00242 inline ScopedHighPrecissionFloatSwitch()
00243 {
00244 mOldFpMode = SAstronomy::EnterHighPrecissionFloatingPointMode();
00245 }
00246
00249 inline ~ScopedHighPrecissionFloatSwitch()
00250 {
00251 SAstronomy::RestoreFloatingPointMode(mOldFpMode);
00252 }
00253 protected:
00254 private:
00255 };
00256
00257 }
00258
00259 #endif