Stellarium 0.13.2
StelUtils.hpp
1 /*
2  * Stellarium
3  * Copyright (C) 2002 Fabien Chereau
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  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
18  */
19 
20 #ifndef _STELUTILS_HPP_
21 #define _STELUTILS_HPP_
22 
23 #include <cmath>
24 #include "VecMath.hpp"
25 
26 #include <QVariantMap>
27 #include <QDateTime>
28 #include <QString>
29 
30 // astronomical unit (km)
31 #define AU 149597870.691
32 #define AU_KM (1.0/149597870.691)
33 // Parsec (km)
34 #define PARSEC 30.857e12
35 // speed of light (km/sec)
36 #define SPEED_OF_LIGHT 299792.458
37 
38 #define stelpow10f(x) std::exp((x) * 2.3025850930f)
39 
41 namespace StelUtils
42 {
44  QString getApplicationName();
45 
47  QString getApplicationVersion();
48 
50  QString getOperatingSystemInfo();
51 
57  double hmsToRad(const unsigned int h, const unsigned int m, const double s);
58 
64  double dmsToRad(const int d, const unsigned int m, const double s);
65 
71  void radToHms(double rad, unsigned int& h, unsigned int& m, double& s);
72 
79  void radToDms(double rad, bool& sign, unsigned int& d, unsigned int& m, double& s);
80 
85  void radToDecDeg(double rad, bool& sign, double& deg);
86 
92  QString radToDecDegStr(const double angle, const int precision = 4, const bool useD=false, const bool useC=false);
93 
97  QString radToHmsStrAdapt(const double angle);
98 
102  QString radToHmsStr(const double angle, const bool decimal=false);
103 
108  QString radToDmsStrAdapt(const double angle, const bool useD=false);
109 
114  QString radToDmsStr(const double angle, const bool decimal=false, const bool useD=false);
115 
122  void decDegToDms(double angle, bool& sign, unsigned int& d, unsigned int& m, double& s);
123 
126  QString decDegToDmsStr(const double angle);
127 
130  double dmsStrToRad(const QString& s);
131 
136  Vec3f strToVec3f(const QStringList& s);
137  Vec3f strToVec3f(const QString& s);
138 
142  QString vec3fToHtmlColor(const Vec3f& v);
143 
146  Vec3f htmlColorToVec3f(const QString& c);
147 
152  void spheToRect(const double lng, const double lat, Vec3d& v);
153 
158  void spheToRect(const float lng, const float lat, Vec3f& v);
159 
164  void rectToSphe(double *lng, double *lat, const Vec3d& v);
165 
170  void rectToSphe(float *lng, float *lat, const Vec3d& v);
171 
176  void rectToSphe(float *lng, float *lat, const Vec3f& v);
177 
179  void ctRadec2Ecl(const double raRad, const double decRad, const double eclRad, double *lambdaRad, double *betaRad);
180 
201  double getDecAngle(const QString& str);
202 
204  bool isPowerOfTwo(const int value);
205 
207  int getBiggerPowerOfTwo(int value);
208 
210  double asinh(const double z);
211 
213  // New Qt based General Calendar Functions.
215  void getDateFromJulianDay(const double julianDay, int *year, int *month, int *day);
216 
218  void getTimeFromJulianDay(const double julianDay, int *hour, int *minute, int *second);
219 
222  bool getDateTimeFromISO8601String(const QString& iso8601Date, int* y, int* m, int* d, int* h, int* min, float* s);
223 
226  QString julianDayToISO8601String(const double jd);
227 
230  double getJulianDayFromISO8601String(const QString& iso8601Date, bool* ok);
231 
236  QString localeDateString(const int year, const int month, const int day, const int dayOfWeek, const QString fmt);
237 
241  QString localeDateString(const int year, const int month, const int day, const int dayOfWeek);
242 
245  double getJDFromSystem();
246 
250  double qTimeToJDFraction(const QTime& time);
251 
253  QTime jdFractionToQTime(const double jd);
254 
256  float getGMTShiftFromQT(const double jd);
257 
261  double qDateTimeToJd(const QDateTime& dateTime);
262 
266  QDateTime jdToQDateTime(const double& jd);
267 
279  bool getJDFromDate(double* newjd, const int y, const int m, const int d, const int h, const int min, const int s);
280 
281  int numberOfDaysInMonthInYear(const int month, const int year);
282  bool changeDateTimeForRollover(int oy, int om, int od, int oh, int omin, int os,
283  int* ry, int* rm, int* rd, int* rh, int* rmin, int* rs);
284 
286  void debugQVariantMap(const QVariant& m, const QString& indent="", const QString& key="");
287 
288 
291  inline float fastAcos(const float x)
292  {
293  return static_cast<float>(M_PI_2) - (x + x*x*x * (1.f/6.f + x*x * (3.f/40.f + 5.f/112.f * x*x)) );
294  }
295 
297  inline float fastExp(const float x)
298  {
299  return (x>=0)?
300  (1.f + x*(1.f+ x/2.f*(1.f+ x/3.f*(1.f+x/4.f*(1.f+x/5.f))))):
301  1.f / (1.f -x*(1.f -x/2.f*(1.f- x/3.f*(1.f-x/4.f*(1.f-x/5.f)))));
302  }
303 
306  inline Vec3f getNightColor(const Vec3f& dayColor)
307  {
308  float max = 0.0;
309  for(int i=0; i<3; i++)
310  {
311  max = dayColor[i] > max ? dayColor[i] : max;
312  }
313  return Vec3f(max, 0, 0);
314  }
315 
317  double calculateSiderealPeriod(const double SemiMajorAxis);
318 
319  QString hoursToHmsStr(const double hours);
320 
328  long double secondsSinceStart();
329 
333  // GZ: I don't see this returning 0. There is always a rough estimate beyond that.
337  double getDeltaTByEspenakMeeus(const double jDay);
338 
347  double getDeltaTBySchoch(const double jDay);
348 
358  double getDeltaTByClemence(const double jDay);
359 
368  double getDeltaTByIAU(const double jDay);
369 
379  double getDeltaTByAstronomicalEphemeris(const double jDay);
380 
385  double getDeltaTByTuckermanGoldstine(const double jDay);
386 
398  double getDeltaTByMullerStephenson(const double jDay);
399 
409  double getDeltaTByStephenson1978(const double jDay);
410 
417  double getDeltaTByStephenson1997(const double jDay);
418 
428  double getDeltaTBySchmadelZech1979(const double jDay);
429 
434  double getDeltaTByMorrisonStephenson1982(const double jDay);
435 
444  double getDeltaTByStephensonMorrison1984(const double jDay);
445 
454  double getDeltaTByStephensonMorrison1995(const double jDay);
455 
460  double getDeltaTByStephensonHoulden(const double jDay);
461 
467  double getDeltaTByEspenak(const double jDay);
468 
477  double getDeltaTByBorkowski(const double jDay);
478 
487  double getDeltaTBySchmadelZech1988(const double jDay);
488 
493  double getDeltaTByChaprontTouze(const double jDay);
494 
499  double getDeltaTByJPLHorizons(const double jDay);
500 
513  double getDeltaTByMorrisonStephenson2004(const double jDay);
514 
520  double getDeltaTByReijs(const double jDay);
521 
526  double getDeltaTByChaprontMeeus(const double jDay);
527 
536  double getDeltaTByMeeusSimons(const double jDay);
537 
544  double getDeltaTByMontenbruckPfleger(const double jDay);
545 
552  double getDeltaTByReingoldDershowitz(const double jDay);
553 
562  double getDeltaTByBanjevic(const double jDay);
563 
576  double getDeltaTByIslamSadiqQureshi(const double jDay);
577 
586  double getMoonSecularAcceleration(const double jDay, const double ndot);
587 
591  double getDeltaTStandardError(const double jDay);
592 
594  template <typename T> int sign(T val) {
595  return (T(0) < val) - (val < T(0));
596  }
597 
602  float *ComputeCosSinTheta(const int slices);
603 
608  float *ComputeCosSinRho(const int segments);
609 
617  float* ComputeCosSinRhoZone(const float dRho, const int segments, const float minAngle);
618 
620  QByteArray uncompress(const QByteArray& data);
621 
622 #ifdef _MSC_BUILD
623  inline double trunc(double x)
624  {
625  return (x < 0 ? std::ceil(x) : std::floor(x));
626  }
627 #else
628  inline double trunc(double x) { return ::trunc(x); }
629 #endif
630 }
631 
632 #endif // _STELUTILS_HPP_
double getDeltaTByMontenbruckPfleger(const double jDay)
Get Delta-T estimation for a given date.
QString decDegToDmsStr(const double angle)
Convert an angle in decimal degrees to a dms formatted string.
bool getDateTimeFromISO8601String(const QString &iso8601Date, int *y, int *m, int *d, int *h, int *min, float *s)
Parse an ISO8601 date string.
bool isPowerOfTwo(const int value)
Check if a number is a power of 2.
QTime jdFractionToQTime(const double jd)
Convert a fraction of a Julian Day to a QTime.
double getDeltaTByMorrisonStephenson2004(const double jDay)
Get Delta-T estimation for a given date.
double getDeltaTByIslamSadiqQureshi(const double jDay)
Get Delta-T estimation for a given date.
double getJDFromSystem()
Get the current Julian Date from system time.
double getDeltaTByJPLHorizons(const double jDay)
Get Delta-T estimation for a given date.
void rectToSphe(double *lng, double *lat, const Vec3d &v)
Convert from spherical coordinates to Rectangular direction.
double getDeltaTByReijs(const double jDay)
Get Delta-T estimation for a given date.
Vec3f strToVec3f(const QStringList &s)
Obtains a Vec3f from a string.
QString getApplicationName()
Return the full name of stellarium, i.e. "stellarium 0.9.0".
double dmsStrToRad(const QString &s)
Convert a dms formatted string to an angle in radian.
void spheToRect(const double lng, const double lat, Vec3d &v)
Convert from spherical coordinates to Rectangular direction.
void getTimeFromJulianDay(const double julianDay, int *hour, int *minute, int *second)
Make from julianDay an hour, minute, second.
double hmsToRad(const unsigned int h, const unsigned int m, const double s)
Convert an angle in hms format to radian.
double getDeltaTByEspenak(const double jDay)
Get Delta-T estimation for a given date.
QString getOperatingSystemInfo()
Return the name and the version of operating system, i.e. "Mac OS X 10.7".
float * ComputeCosSinRho(const int segments)
Compute cosines and sines around a half-circle which is split in "segments" parts.
float * ComputeCosSinTheta(const int slices)
Compute cosines and sines around a circle which is split in "segments" parts.
QString radToHmsStrAdapt(const double angle)
Convert an angle in radian to a hms formatted string.
QString vec3fToHtmlColor(const Vec3f &v)
Converts a Vec3f to HTML color notation.
double getDeltaTByBanjevic(const double jDay)
Get Delta-T estimation for a given date.
double getDeltaTByChaprontTouze(const double jDay)
Get Delta-T estimation for a given date.
QDateTime jdToQDateTime(const double &jd)
Convert a julian day to a QDateTime.
Vec3f getNightColor(const Vec3f &dayColor)
Get a night mode version of a color.
Definition: StelUtils.hpp:306
void radToDecDeg(double rad, bool &sign, double &deg)
Convert an angle in radian to decimal degree.
double qDateTimeToJd(const QDateTime &dateTime)
Convert a QT QDateTime class to julian day.
void radToHms(double rad, unsigned int &h, unsigned int &m, double &s)
Convert an angle in radian to hms format.
double getDeltaTByMorrisonStephenson1982(const double jDay)
Get Delta-T estimation for a given date.
double getDeltaTByTuckermanGoldstine(const double jDay)
Get Delta-T estimation for a given date.
void decDegToDms(double angle, bool &sign, unsigned int &d, unsigned int &m, double &s)
Convert an angle in decimal degree to +-dms format.
double getDeltaTByBorkowski(const double jDay)
Get Delta-T estimation for a given date.
double getDeltaTBySchmadelZech1988(const double jDay)
Get Delta-T estimation for a given date.
QString radToDecDegStr(const double angle, const int precision=4, const bool useD=false, const bool useC=false)
Convert an angle in radian to a decimal degree string.
QString getApplicationVersion()
Return the version of stellarium, i.e. "0.9.0".
QString julianDayToISO8601String(const double jd)
Format the given Julian Day in (UTC) ISO8601 date string.
double getDeltaTByChaprontMeeus(const double jDay)
Get Delta-T estimation for a given date.
float fastAcos(const float x)
Compute acos(x) The taylor serie is not accurate around x=1 and x=-1.
Definition: StelUtils.hpp:291
void ctRadec2Ecl(const double raRad, const double decRad, const double eclRad, double *lambdaRad, double *betaRad)
Coordinate Transformation from equatorial to ecliptical.
double getDeltaTBySchoch(const double jDay)
Get Delta-T estimation for a given date.
double getDeltaTByStephensonMorrison1984(const double jDay)
Get Delta-T estimation for a given date.
QString radToDmsStr(const double angle, const bool decimal=false, const bool useD=false)
Convert an angle in radian to a dms formatted string.
double getDeltaTBySchmadelZech1979(const double jDay)
Get Delta-T estimation for a given date.
double getDeltaTByIAU(const double jDay)
Get Delta-T estimation for a given date.
double getDeltaTByEspenakMeeus(const double jDay)
Get Delta-T estimation for a given date.
void radToDms(double rad, bool &sign, unsigned int &d, unsigned int &m, double &s)
Convert an angle in radian to +-dms format.
double dmsToRad(const int d, const unsigned int m, const double s)
Convert an angle in +-dms format to radian.
double calculateSiderealPeriod(const double SemiMajorAxis)
Calculate and getting sidereal period in days from semi-major axis (in AU)
QString localeDateString(const int year, const int month, const int day, const int dayOfWeek, const QString fmt)
Format the date and day-of-week per the format in fmt (see QDateTime::toString()).
double getMoonSecularAcceleration(const double jDay, const double ndot)
Get Secular Acceleration estimation for a given year.
double getDeltaTByStephenson1997(const double jDay)
Get Delta-T estimation for a given date.
double getDeltaTByStephenson1978(const double jDay)
Get Delta-T estimation for a given date.
QString radToDmsStrAdapt(const double angle, const bool useD=false)
Convert an angle in radian to a dms formatted string.
double getDeltaTByAstronomicalEphemeris(const double jDay)
Get Delta-T estimation for a given date.
double getDeltaTByClemence(const double jDay)
Get Delta-T estimation for a given date.
double getDeltaTByMeeusSimons(const double jDay)
Get Delta-T estimation for a given date.
double getDecAngle(const QString &str)
Convert a string longitude, latitude, RA or Declination angle to radians.
int getBiggerPowerOfTwo(int value)
Return the first power of two bigger than the given value.
long double secondsSinceStart()
Get the number of seconds since program start.
double getDeltaTByMullerStephenson(const double jDay)
Get Delta-T estimation for a given date.
double getDeltaTByStephensonMorrison1995(const double jDay)
Get Delta-T estimation for a given date.
A templatized 3d vector compatible with openGL.
Definition: VecMath.hpp:31
float * ComputeCosSinRhoZone(const float dRho, const int segments, const float minAngle)
Compute cosines and sines around part of a circle (from top to bottom) which is split in "segments" p...
QString radToHmsStr(const double angle, const bool decimal=false)
Convert an angle in radian to a hms formatted string.
double getJulianDayFromISO8601String(const QString &iso8601Date, bool *ok)
Return the Julian Date matching the ISO8601 date string.
QByteArray uncompress(const QByteArray &data)
Uncompress gzip or zlib compressed data.
int sign(T val)
Sign function from http://stackoverflow.com/questions/1903954/is-there-a-standard-sign-function-signu...
Definition: StelUtils.hpp:594
double qTimeToJDFraction(const QTime &time)
Convert a time of day to the fraction of a Julian Day.
bool getJDFromDate(double *newjd, const int y, const int m, const int d, const int h, const int min, const int s)
Compute Julian day number from calendar date.
void getDateFromJulianDay(const double julianDay, int *year, int *month, int *day)
Make from julianDay a year, month, day for the Julian Date julianDay represents.
double getDeltaTStandardError(const double jDay)
Get the standard error (sigma) for the value of DeltaT.
double getDeltaTByReingoldDershowitz(const double jDay)
Get Delta-T estimation for a given date.
double getDeltaTByStephensonHoulden(const double jDay)
Get Delta-T estimation for a given date.
float fastExp(const float x)
Compute exp(x) for small exponents x.
Definition: StelUtils.hpp:297
Vec3f htmlColorToVec3f(const QString &c)
Converts a color in HTML notation to a Vec3f.
double asinh(const double z)
Return the inverse sinus hyperbolic of z.
float getGMTShiftFromQT(const double jd)
Return number of hours offset from GMT, using Qt functions.
void debugQVariantMap(const QVariant &m, const QString &indent="", const QString &key="")
Output a QVariantMap to qDebug(). Formats like a tree where there are nested objects.