Home · All Namespaces · All Classes · Functions · Coding Style · Scripting · Plugins · File Structure

core/StelNavigator.hpp

00001 /*
00002  * Stellarium
00003  * Copyright (C) 2002 Fabien Chereau
00004  *
00005  * This program is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU General Public License
00007  * as published by the Free Software Foundation; either version 2
00008  * of the License, or (at your option) any later version.
00009  *
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  * GNU General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public License
00016  * along with this program; if not, write to the Free Software
00017  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00018  */
00019 
00020 #ifndef _STELNAVIGATOR_HPP_
00021 #define _STELNAVIGATOR_HPP_
00022 
00023 #include "VecMath.hpp"
00024 #include "StelLocation.hpp"
00025 
00026 #include <QObject>
00027 #include <QString>
00028 #include <QTime>
00029 #include <QDateTime>
00030 
00031 // Conversion in standar Julian time format
00032 #define JD_SECOND 0.000011574074074074074074
00033 #define JD_MINUTE 0.00069444444444444444444
00034 #define JD_HOUR   0.041666666666666666666
00035 #define JD_DAY    1.
00036 
00037 class StelObserver;
00038 class StelObject;
00039 
00046 class StelNavigator : public QObject
00047 {
00048     Q_OBJECT
00049     Q_PROPERTY(double timeRate READ getTimeRate WRITE setTimeRate)
00050 
00051 public:
00052     // Create and initialise to default a navigation context
00053     StelNavigator();
00054     ~StelNavigator();
00055 
00056     void init();
00057 
00058     void updateTime(double deltaTime);
00059     void updateTransformMatrices(void);
00060 
00062     void lookAtJ2000(const Vec3d& pos, const Vec3d& up);
00063 
00065     const StelLocation& getCurrentLocation() const;
00066 
00072     void moveObserverTo(const StelLocation& target, double duration=1., double durationIfPlanetChange=1.);
00073 
00076     double getLocalSideralTime() const;
00077 
00079     double getLocalSideralDayLength() const;
00080 
00082     Vec3d getObserverHeliocentricEclipticPos() const;
00083 
00084 
00085     Vec3d altAzToEquinoxEqu(const Vec3d& v) const {return matAltAzToEquinoxEqu*v;}
00086     Vec3d equinoxEquToAltAz(const Vec3d& v) const {return matEquinoxEquToAltAz*v;}
00087     Vec3d equinoxEquToJ2000(const Vec3d& v) const {return matEquinoxEquToJ2000*v;}
00088     Vec3d altAzToJ2000(const Vec3d& v) const {return matEquinoxEquToJ2000*matAltAzToEquinoxEqu*v;}
00089     Vec3d galacticToJ2000(const Vec3d& v) const {return matGalacticToJ2000*v;}
00090     Vec3d j2000ToEquinoxEqu(const Vec3d& v) const {return matJ2000ToEquinoxEqu*v;}
00091     Vec3d j2000ToAltAz(const Vec3d& v) const {return matJ2000ToAltAz*v;}
00092     Vec3d j2000ToGalactic(const Vec3d& v) const {return matJ2000ToGalactic*v;}
00094     Vec3d heliocentricEclipticToAltAz(const Vec3d& v) const {return matHeliocentricEclipticToAltAz*v;}
00096     Vec3d heliocentricEclipticToEquinoxEqu(const Vec3d& v) const {return matHeliocentricEclipticToEquinoxEqu*v;}
00099     Vec3d heliocentricEclipticToEarthPosEquinoxEqu(const Vec3d& v) const {return matAltAzToEquinoxEqu*matHeliocentricEclipticToAltAz*v;}
00100 
00102     const Mat4d getHeliocentricEclipticModelViewMat() const {return matAltAzModelView*matHeliocentricEclipticToAltAz;}
00104     const Mat4d getObservercentricEclipticModelViewMat() const {return matAltAzModelView*matJ2000ToAltAz*matVsop87ToJ2000;}
00106     const Mat4d getEquinoxEquModelViewMat() const {return matAltAzModelView*matEquinoxEquToAltAz;}
00108     const Mat4d& getAltAzModelViewMat() const {return matAltAzModelView;}
00110     const Mat4d getJ2000ModelViewMat() const {return matAltAzModelView*matEquinoxEquToAltAz*matJ2000ToEquinoxEqu;}
00112     const Mat4d getGalacticModelViewMat() const {return getJ2000ModelViewMat()*matGalacticToJ2000;}
00113 
00115     QString getStartupTimeMode() {return startupTimeMode;}
00116     void setStartupTimeMode(const QString& s);
00117 
00119     static const Mat4d matJ2000ToVsop87;
00121     static const Mat4d matVsop87ToJ2000;
00123     static const Mat4d matJ2000ToGalactic;
00125     static const Mat4d matGalacticToJ2000;
00126 
00127 public slots:
00129     void setJDay(double JD) {JDay=JD;}
00131     double getJDay() const {return JDay;}
00132 
00134     double getPresetSkyTime() const {return presetSkyTime;}
00136     void setPresetSkyTime(double d) {presetSkyTime=d;}
00137 
00139     void setTimeRate(double ts) {timeSpeed=ts; emit timeRateChanged(timeSpeed);}
00141     double getTimeRate() const {return timeSpeed;}
00142 
00144     void increaseTimeSpeed();
00146     void decreaseTimeSpeed();
00148     void increaseTimeSpeedLess();
00150     void decreaseTimeSpeedLess();
00151 
00153     void setZeroTimeSpeed() {setTimeRate(0);}
00155     void setRealTimeSpeed() {setTimeRate(JD_SECOND);}
00157     void toggleRealTimeSpeed() {(!getRealTimeSpeed()) ? setRealTimeSpeed() : setZeroTimeSpeed();}
00159     bool getRealTimeSpeed() const {return (fabs(timeSpeed-JD_SECOND)<0.0000001);}
00160 
00162     void setTimeNow();
00164     void setTodayTime(const QTime& target);
00166     bool getIsTimeNow() const;
00167 
00169     QTime getInitTodayTime(void) {return initTodayTime;}
00171     void setInitTodayTime(const QTime& t) {initTodayTime=t;}
00173     void setPresetSkyTime(QDateTime dt);
00174 
00176     void addHour() {addSolarDays(0.04166666666666666667);}
00178     void addDay() {addSolarDays(1.0);}
00180     void addWeek() {addSolarDays(7.0);}
00181 
00184     void addSiderealDay() {addSiderealDays(1.0);}
00187     void addSiderealWeek() {addSiderealDays(7.0);}
00188 
00190     void subtractHour() {addSolarDays(-0.04166666666666666667);}
00192     void subtractDay() {addSolarDays(-1.0);}
00194     void subtractWeek() {addSolarDays(-7.0);}
00195 
00198     void subtractSiderealDay() {addSiderealDays(-1.0);}
00201     void subtractSiderealWeek() {addSiderealDays(-7.0);}
00202 
00205     void addSolarDays(double d);
00209     void addSiderealDays(double d);
00210 
00213     void moveObserverToSelected();
00214 
00216     QString getDefaultLocationID() const {return defaultLocationID;}
00218     void setDefaultLocationID(const QString& id);
00219 
00220 signals:
00222     void locationChanged(StelLocation);
00224     void timeRateChanged(double rate);
00225 
00226 private:
00227     // Matrices used for every coordinate transfo
00228     Mat4d matHeliocentricEclipticToAltAz;   // Transform from heliocentric ecliptic (Vsop87) to observer-centric altazimuthal coordinate
00229     Mat4d matAltAzToHeliocentricEcliptic;   // Transform from observer-centric altazimuthal coordinate to heliocentric ecliptic (Vsop87)
00230     Mat4d matAltAzToEquinoxEqu;             // Transform from observer-centric altazimuthal coordinate to Earth Equatorial
00231     Mat4d matEquinoxEquToAltAz;             // Transform from observer-centric altazimuthal coordinate to Earth Equatorial
00232     Mat4d matHeliocentricEclipticToEquinoxEqu;// Transform from heliocentric ecliptic (Vsop87) to earth equatorial coordinate
00233     Mat4d matEquinoxEquToJ2000;
00234     Mat4d matJ2000ToEquinoxEqu;
00235     Mat4d matJ2000ToAltAz;
00236 
00237     Mat4d matAltAzModelView;                    // Modelview matrix for observer-centric altazimuthal drawing
00238 
00239     // Time variable
00240     double timeSpeed;        // Positive : forward, Negative : Backward, 1 = 1sec/sec
00241     double JDay;              // Curent time in Julian day
00242 
00243     double presetSkyTime;
00244     QTime initTodayTime;
00245     QString startupTimeMode;
00246 
00247     // The ID of the default startup location
00248     QString defaultLocationID;
00249 
00250     // Position variables
00251     StelObserver* position;
00252 };
00253 
00254 #endif // _STELNAVIGATOR_HPP_