3 #include <QMutexLocker>
10 SLUNCE::SLUNCE(QCoreApplication *) : QThread(0) {
13 datum = QDateTime::currentDateTime();
18 void SLUNCE::start(Priority priority) {
19 QTimer::singleShot(10,
this, SLOT(slotInit()));
20 QThread::start(priority);
24 void SLUNCE::slotInit() {
26 QTimer *t =
new QTimer(
this);
27 t->setSingleShot(
false);
28 t->setInterval(60000);
30 connect(t, SIGNAL(timeout()),
this, SLOT(spocti()) );
46 void SLUNCE::spocti() {
47 QMutexLocker locker(&m_mutex);
48 datum = QDateTime::currentDateTime();
55 QMutexLocker locker(&m_mutex);
61 QMutexLocker locker(&m_mutex);
67 QMutexLocker locker(&m_mutex);
73 QMutexLocker locker(&m_mutex);
78 void SLUNCE::sun_ra_dec() {
81 QDateTime epoch = QDateTime(QDate(2000,1,1),QTime(12,00),Qt::UTC);
82 datum_jd = ((double)epoch.secsTo( datum )) / 86400 ;
84 double mean_longitude = to360 (280.461 + 0.9856474 * datum_jd);
85 double mean_anomaly = to360 (357.528 + 0.9856003 * datum_jd);
86 double ecliptic_longitude = to360 (mean_longitude + 1.915 * sin(mean_anomaly/DTR) + 0.020 * sin(2*mean_anomaly/DTR));
87 double ecliptic_obliquity = to360 (23.429 - 0.0000004 * datum_jd);
88 double Y = cos(ecliptic_obliquity/DTR) * sin(ecliptic_longitude/DTR);
89 double X = cos(ecliptic_longitude/DTR);
92 sun_ra = DTR * atan2 (Y, X);
93 sun_dec = DTR * asin (sin(ecliptic_obliquity/DTR) * sin(ecliptic_longitude/DTR));
98 void SLUNCE::sun_alt_az() {
99 double gmt_mean_sidereal_time ;
100 double local_mean_sidereal_time ;
103 double date = floor(datum_jd);
104 double hour = (datum_jd - date - 0.5) * 24;
106 gmt_mean_sidereal_time = to24 ( 6.697375 + 0.0657098242 * date + hour);
107 local_mean_sidereal_time = to24 ( gmt_mean_sidereal_time + obs_long / 15. );
108 hour_angle = to360( local_mean_sidereal_time * 15.0 - sun_ra );
110 sun_alt = sin(sun_dec/DTR) * sin(obs_lat/DTR) + cos(sun_dec/DTR) * cos(obs_lat/DTR) * cos(hour_angle/DTR);
111 sun_alt = asin(sun_alt) * DTR;
113 sun_az = (sin(sun_dec/DTR) - sin(sun_alt/DTR) * sin(obs_lat/DTR) ) /
114 (cos(sun_alt/DTR) * cos(obs_lat/DTR) );
115 sun_az = acos(sun_az) * DTR;
116 if (sin(hour_angle/DTR)>0) { sun_az = 360 - sun_az; }
120 QString SLUNCE::toDeg(
double x) {
122 double mf = (x - d) * 60;
123 double m = floor(mf);
124 double s = (mf - m) * 60;
125 return QString(QString(
"%1:%2:%3").arg(d).arg(m).arg(s));
128 double SLUNCE::to360(
double x) {
129 while (x < 0) { x = x + 360; }
130 while (x > 360) { x = x - 360; }
134 double SLUNCE::to24(
double x) {
135 while (x < 0) { x = x + 24; }
136 while (x > 24) { x = x - 24; }
double alt()
Vrací výšku slunce nad obzorem.
double ra()
Vrací rektascenzi slunce.
void setObserver(double lat, double lng)
double dec()
Vrací deklinaci slunce.
double az()
Vrací azimut slunce.