diff options
Diffstat (limited to 'kstars/kstars/kstarsdatetime.h')
-rw-r--r-- | kstars/kstars/kstarsdatetime.h | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/kstars/kstars/kstarsdatetime.h b/kstars/kstars/kstarsdatetime.h new file mode 100644 index 00000000..37e565aa --- /dev/null +++ b/kstars/kstars/kstarsdatetime.h @@ -0,0 +1,199 @@ +/*************************************************************************** + kstarsdatetime.h - K Desktop Planetarium + ------------------- + begin : Tue 05 May 2004 + copyright : (C) 2001 by Jason Harris + email : jharris@30doradus.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KSTARSDATETIME_H +#define KSTARSDATETIME_H + +#define J2000 2451545.0 //Julian Date for noon on Jan 1, 2000 (epoch J2000) + //defined here because this file is included in every other class. +#define B1950 2433282.4235 // Julian date for Jan 0.9235, 1950 +#define SIDEREALSECOND 1.002737909 //number of sidereal seconds in one solar second + +#include "libkdeedu/extdate/extdatetime.h" + +class dms; + +/**@class KStarsDateTime + *@short Extension of ExtDateTime for KStars + *Instead of an integer Julian Day, KStarsDateTime uses a long double Julian Day, + *in which the fractional portion encodes the time of day to a precision of a less than a second. + *Also adds Greenwich Sidereal Time. + *@note Local time and Local sideral time are not handled here. Because they depend on the + *geographic location, they are part of the GeoLocation class. + *@sa GeoLocation::GSTtoLST() + *@sa GeoLocation::UTtoLT() + *@author Jason Harris + *@version 1.0 + */ + +class KStarsDateTime : public ExtDateTime +{ +public: +/** + *@short Default constructor + *Creates a date/time at J2000 (noon on Jan 1, 200) + */ + KStarsDateTime(); + +/** + *@short Constructor + *Creates a date/time at the specified Julian Day. + *@p jd The Julian Day + *@note this is overloaded from ExtDateTime. It does not allow for assigning the + *time of day, because the jd argument is an integer + */ + KStarsDateTime( long int jd ); + +/** + *@short Constructor + *Creates a date/time at the specified Julian Day. + *@p jd The Julian Day + */ + KStarsDateTime( double djd ); + +/** + *@short Constructor + *Creates a date/time at the specified Julian Day. + *@p jd The Julian Day + */ + KStarsDateTime( long double djd ); + +/** + *@short Copy constructor + *@p kdt The KStarsDateTime object to copy. + */ + KStarsDateTime( const KStarsDateTime &kdt ); + +/** + *@short Copy constructor + *@p kdt The ExtDateTime object to copy. + */ + KStarsDateTime( const ExtDateTime &kdt ); + +/** + *@short Constructor + *Create a KStarsDateTimne based on the specified Date and Time. + *@p _d The ExtDate to assign + *@p _t The QTime to assign + */ + KStarsDateTime( const ExtDate &_d, const QTime &_t ); + +/** + *Assign the (long double) Julian Day value, which includes the time of day + *encoded in the fractional portion. + *@p jd the Julian Day value to assign. + */ + void setDJD( long double jd ); + +/** + *Assign the Date according to an ExtDate object. + *@p d the ExtDate to assign + */ + void setDate( const ExtDate &d ); + +/** + *Assign the Time according to a QTime object. + *@p t the QTime to assign + */ + void setTime( const QTime &t ); + +/** + *Modify the Date/Time by adding a number of seconds. + *@p s the number of seconds to add. The number can be negative. + */ + KStarsDateTime addSecs( long double s ) const { return KStarsDateTime( djd() + s/86400. ); } + +/** + *Modify the Date/Time by adding a number of days. + *@p nd the number of days to add. The number can be negative. + */ + KStarsDateTime addDays( int nd ) const { return KStarsDateTime( djd() + (long double)nd ); } + + bool operator == ( const KStarsDateTime &d ) const { return DJD == d.djd(); } + bool operator != ( const KStarsDateTime &d ) const { return DJD != d.djd(); } + bool operator < ( const KStarsDateTime &d ) const { return DJD < d.djd(); } + bool operator <= ( const KStarsDateTime &d ) const { return DJD <= d.djd(); } + bool operator > ( const KStarsDateTime &d ) const { return DJD > d.djd(); } + bool operator >= ( const KStarsDateTime &d ) const { return DJD >= d.djd(); } + +/** + *@return the date and time according to the CPU clock (note that this is not + *necessarily UT) + */ + static KStarsDateTime currentDateTime(); + +/** + *@return the julian day as a long double, including the time as the fractional portion. + */ + long double djd() const { return DJD; } + +/** + *@return the fraction of the Julian Day corresponding to the current time. + *Because the integer Julian Day value jd() is referenced to Noon on the current date, + *jdFrac() ranges between values of -0.5 and +0.5 for the previous and next midnights, + *respectively. + */ + double jdFrac() const { return ((time().hour()-12) + (time().minute() + + (time().second() + time().msec()/1000.)/60.)/60.)/24.; } + +/** + *@return the Julian Day value for the current date, but at 0h UT. + *@note the returned value is always an integer value + 0.5. + */ + long double JDat0hUT() const { return int( djd() - 0.5 ) + 0.5; } + +/** + *@return The Greenwich Sidereal Time + *The Greenwich sidereal time is the Right Ascension coordinate that is currently transiting + *the Prime Meridian at the Royal Observatory in Greenwich, UK (longitude=0.0) + */ + dms gst() const; + +/** + *Convert a given Greenwich Sidereal Time to Universal Time (=Greenwich Mean Time). + *@p GST the Greenwich Sidereal Time to convert to Universal Time. + */ + QTime GSTtoUT( dms GST ) const; + + +/** + *@return the epoch value of the Date/Time. + *@note the epoch is shorthand for the date, expressed as a floating-point year value. + *@sa setFromEpoch() + */ + double epoch() const { return ( double( date().year() ) + + double( date().dayOfYear() )/double( date().daysInYear() ) ); } + +/** + *Set the Date/Time from an epoch value. + *@p e the epoch value + *@sa epoch() + */ + void setFromEpoch( double e ); + +private: +/** + *@return the Greenwich Sidereal Time at 0h UT on this object's Date + *@note used internally by gst() and GSTtoUT() + */ + dms GSTat0hUT() const; + + long double DJD; +}; + +#endif //KSTARSDATETIME_H + |