summaryrefslogtreecommitdiffstats
path: root/kstars/kstars/kstarsdatetime.cpp
blob: 74d1fc20eb23fc04ac23df4bba8438f92057724b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
 /***************************************************************************
                          kstarsdatetime.cpp  -  K Desktop Planetarium
                             -------------------
    begin                : Tue 05 May 2004
    copyright            : (C) 2004 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.                                   *
 *                                                                         *
 ***************************************************************************/

#include <kdebug.h>
 
#include "kstarsdatetime.h"
#include "ksnumbers.h"
#include "dms.h"

KStarsDateTime::KStarsDateTime() : ExtDateTime() {
	setDJD( J2000 );
}

KStarsDateTime::KStarsDateTime( long int _jd ) : ExtDateTime(){
	setDJD( (long double)( _jd ) );
}

KStarsDateTime::KStarsDateTime( const KStarsDateTime &kdt ) : ExtDateTime() {
	setDJD( kdt.djd() );
}

KStarsDateTime::KStarsDateTime( const ExtDateTime &edt ) : ExtDateTime( edt ) {
	//don't call setDJD() because we don't need to compute the time; just set DJD directly
	QTime _t = edt.time();
	ExtDate _d = edt.date();
	long double jdFrac = ( _t.hour()-12 + ( _t.minute() + ( _t.second() + _t.msec()/1000.)/60.)/60.)/24.;
	DJD = (long double)( _d.jd() ) + jdFrac;
}

KStarsDateTime::KStarsDateTime( const ExtDate &_d, const QTime &_t ) : ExtDateTime( _d, _t ) {
	//don't call setDJD() because we don't need to compute the time; just set DJD directly
	long double jdFrac = ( _t.hour()-12 + ( _t.minute() + ( _t.second() + _t.msec()/1000.)/60.)/60.)/24.;
	DJD = (long double)( _d.jd() ) + jdFrac;
}

KStarsDateTime::KStarsDateTime( double _jd ) : ExtDateTime() {
	setDJD( (long double)_jd );
}

KStarsDateTime::KStarsDateTime( long double _jd ) : ExtDateTime() {
	setDJD( _jd );
}

KStarsDateTime KStarsDateTime::currentDateTime() {
	KStarsDateTime dt( ExtDate::currentDate(), QTime::currentTime() );
	if ( dt.time().hour()==0 && dt.time().minute()==0 ) // midnight or right after?
			dt.setDate( ExtDate::currentDate() );         // fetch date again
	
	return dt;
}

void KStarsDateTime::setDJD( long double _jd ) {
	DJD = _jd;

	ExtDate dd;
	dd.setJD( (long int)( _jd + 0.5 ) );
	ExtDateTime::setDate( dd );

	double dayfrac = _jd - (double)( date().jd() ) + 0.5;
	if ( dayfrac > 1.0 ) dayfrac -= 1.0;
	double hour = 24.*dayfrac;
	int h = int(hour);
	int m = int( 60.*(hour - h) );
	int s = int( 60.*(60.*(hour - h) - m) );
	int ms = int( 1000.*(60.*(60.*(hour - h) - m) - s) );

	ExtDateTime::setTime( QTime( h, m, s, ms ) );
}

void KStarsDateTime::setDate( const ExtDate &_d ) {
	//Save the JD fraction
	long double jdFrac = djd() - (long double)( date().jd() );
	
	//set the integer portion of the JD and add back the JD fraction:
	setDJD( (long double)_d.jd() + jdFrac );
}

void KStarsDateTime::setTime( const QTime &_t ) {
	KStarsDateTime _dt( date(), _t );
	setDJD( _dt.djd() );
}

dms KStarsDateTime::gst() const {
	dms gst0 = GSTat0hUT();

	double hr = double( time().hour() );
	double mn = double( time().minute() );
	double sc = double( time().second() ) + double ( 0.001 * time().msec() );
	double st = (hr + ( mn + sc/60.0)/60.0)*SIDEREALSECOND;

	dms gst = dms( gst0.Degrees() + st*15.0 ).reduce();
	return gst;
}

dms KStarsDateTime::GSTat0hUT() const {
	double sinOb, cosOb;

	// Mean greenwich sidereal time
	KStarsDateTime t0( date(), QTime( 0, 0, 0 ) );
	long double s = t0.djd() - J2000;
	double t = s/36525.0;
	double t1 = 6.697374558 + 2400.051336*t + 0.000025862*t*t +
		0.000000002*t*t*t;

	// To obtain the apparent sidereal time, we have to correct the
	// mean greenwich sidereal time with nutation in longitude multiplied
	// by the cosine of the obliquity of the ecliptic. This correction
	// is called nutation in right ascention, and may amount to 0.3 secs.
	KSNumbers num( t0.djd() );
	num.obliquity()->SinCos( sinOb, cosOb );

	// nutLong has to be in hours of time since t1 is hours of time.
	double nutLong = num.dEcLong()*cosOb/15.0;
	t1 += nutLong;

	dms gst;
	gst.setH( t1 );
	return gst.reduce();
}

QTime KStarsDateTime::GSTtoUT( dms GST ) const {
	dms gst0 = GSTat0hUT();

	//dt is the number of sidereal hours since UT 0h.
	double dt = GST.Hours() - gst0.Hours();
	while ( dt < 0.0 ) dt += 24.0;
	while ( dt >= 24.0 ) dt -= 24.0;

	//convert to solar time.  dt is now the number of hours since 0h UT.
	dt /= SIDEREALSECOND;

	int hr = int( dt );
	int mn = int( 60.0*( dt - double( hr ) ) );
	int sc = int( 60.0*( 60.0*( dt - double( hr ) ) - double( mn ) ) );
	int ms = int( 1000.0*( 60.0*( 60.0*( dt - double(hr) ) - double(mn) ) - double(sc) ) );
	
	return( QTime( hr, mn, sc, ms ) );
}

void KStarsDateTime::setFromEpoch( double epoch ) {
	if (epoch == 1950.0) {
		setDJD( 2433282.4235 );
	} else if ( epoch == 2000.0 ) {
		setDJD( J2000 );
	} else {
		int year = int( epoch );
		KStarsDateTime dt( ExtDate( year, 1, 1 ), QTime( 0, 0, 0 ) );
		double days = (double)(dt.date().daysInYear())*( epoch - (double)year );
		dt = dt.addSecs( days*86400. ); //set date and time based on the number of days into the year
		setDJD( dt.djd() );
	}
}