summaryrefslogtreecommitdiffstats
path: root/kstars/kstars/skypoint.h
diff options
context:
space:
mode:
Diffstat (limited to 'kstars/kstars/skypoint.h')
-rw-r--r--kstars/kstars/skypoint.h498
1 files changed, 498 insertions, 0 deletions
diff --git a/kstars/kstars/skypoint.h b/kstars/kstars/skypoint.h
new file mode 100644
index 00000000..ee3cf09c
--- /dev/null
+++ b/kstars/kstars/skypoint.h
@@ -0,0 +1,498 @@
+/***************************************************************************
+ skypoint.h - K Desktop Planetarium
+ -------------------
+ begin : Sun Feb 11 2001
+ copyright : (C) 2001-2005 by Jason Harris
+ email : jharris@30doradus.org
+ copyright : (C) 2004-2005 by Pablo de Vicente
+ email : p.devicente@wanadoo.es
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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 SKYPOINT_H
+#define SKYPOINT_H
+
+#include <qstring.h>
+#include <qptrlist.h>
+
+#include "dms.h"
+
+/**@class SkyPoint
+ *
+ *The sky coordinates of a point in the sky. The
+ *coordinates are stored in both Equatorial (Right Ascension,
+ *Declination) and Horizontal (Azimuth, Altitude) coordinate systems.
+ *Provides set/get functions for each coordinate angle, and functions
+ *to convert between the Equatorial and Horizon coordinate systems.
+ *
+ *Because the coordinate values change slowly over time (due to
+ *precession, nutation), the "catalog coordinates" are stored
+ *(RA0, Dec0), which were the true coordinates on Jan 1, 2000.
+ *The true coordinates (RA, Dec) at any other epoch can be found
+ *from the catalog coordinates using updateCoords().
+ *@short Stores dms coordinates for a point in the sky.
+ *for converting between coordinate systems.
+ *@author Jason Harris
+ *@version 1.0
+ */
+
+class KSNumbers;
+class CSegment;
+class SkyObject;
+
+class SkyPoint {
+public:
+/**Default constructor: Sets RA, Dec and RA0, Dec0 according
+ *to arguments. Does not set Altitude or Azimuth.
+ *@param r Right Ascension
+ *@param d Declination
+ */
+ SkyPoint( const dms& r, const dms& d ) { set( r, d ); }
+
+/**Alternate constructor using pointer arguments, for convenience.
+ *It behaves essentially like the default constructor.
+ *@param r Right Ascension pointer
+ *@param d Declination pointer
+ */
+ SkyPoint( const dms *r, const dms *d ) { set( dms(*r), dms(*d) ); }
+
+/**Alternate constructor using double arguments, for convenience.
+ *It behaves essentially like the default constructor.
+ *@param r Right Ascension, expressed as a double
+ *@param d Declination, expressed as a double
+ */
+ SkyPoint( double r=0.0, double d=0.0 ) { set( r, d ); }
+
+/**
+ *Empty destructor.
+ */
+ virtual ~SkyPoint();
+
+////
+//// 1. Setting Coordinates
+//// =======================
+
+/**Sets RA, Dec and RA0, Dec0 according to arguments.
+ *Does not set Altitude or Azimuth.
+ *@param r Right Ascension
+ *@param d Declination
+ */
+ void set( const dms& r, const dms& d );
+
+/**Overloaded member function, provided for convenience.
+ *It behaves essentially like the above function.
+ *@param r Right Ascension
+ *@param d Declination
+ */
+ void set( const dms *r, const dms *d ) { set( *r, *d ); }
+
+/**Overloaded member function, provided for convenience.
+ *It behaves essentially like the above function.
+ *@param r Right Ascension
+ *@param d Declination
+ */
+ void set( double r, double d );
+
+/**Sets RA0, the catalog Right Ascension.
+ *@param r catalog Right Ascension.
+ */
+ void setRA0( dms r ) { RA0.set( r ); }
+
+/**Overloaded member function, provided for convenience.
+ *It behaves essentially like the above function.
+ *@param r Right Ascension, expressed as a double.
+ */
+ void setRA0( double r ) { RA0.setH( r ); }
+
+/**Sets Dec0, the catalog Declination.
+ *@param d catalog Declination.
+ */
+ void setDec0( dms d ) { Dec0.set( d ); }
+
+/**Overloaded member function, provided for convenience.
+ *It behaves essentially like the above function.
+ *@param d Declination, expressed as a double.
+ */
+ void setDec0( double d ) { Dec0.setD( d ); }
+
+/**Sets RA, the current Right Ascension.
+ *@param r Right Ascension.
+ */
+ void setRA( dms r ) { RA.set( r ); }
+
+/**Overloaded member function, provided for convenience.
+ *It behaves essentially like the above function.
+ *@param r Right Ascension, expressed as a double.
+ */
+ void setRA( double r ) { RA.setH( r ); }
+
+/**Sets Dec, the current Declination
+ *@param d Declination.
+ */
+ void setDec( dms d ) { Dec.set( d ); }
+
+/**Overloaded member function, provided for convenience.
+ *It behaves essentially like the above function.
+ *@param d Declination, expressed as a double.
+ */
+ void setDec( double d ) { Dec.setD( d ); }
+
+/**Sets Alt, the Altitude.
+ *@param alt Altitude.
+ */
+ void setAlt( dms alt ) { Alt.set( alt ); }
+
+/**Overloaded member function, provided for convenience.
+ *It behaves essentially like the above function.
+ *@param alt Altitude, expressed as a double.
+ */
+ void setAlt( double alt ) { Alt.setD( alt ); }
+
+/**Sets Az, the Azimuth.
+ *@param az Azimuth.
+ */
+ void setAz( dms az ) { Az.set( az ); }
+
+/**Overloaded member function, provided for convenience.
+ *It behaves essentially like the above function.
+ *@param az Azimuth, expressed as a double.
+ */
+ void setAz( double az ) { Az.setD( az ); }
+
+/**Sets Galactic Longitude.
+ *@param glo Galactic Longitude.
+ */
+// void setGalLong( dms glo ) { galLong.set( glo ); }
+
+/**Overloaded member function, provided for convenience.
+ *It behaves essentially like the above function.
+ *@param glo Galactic Longitude, expressed as a double.
+ */
+// void setGalLong( double glo ) { galLong.setD( glo ); }
+
+/**Sets Galactic Longitude.
+ *@param gla Galactic Longitude.
+ */
+// void setGalLat( dms gla ) { galLat.set( gla ); }
+
+/**Overloaded member function, provided for convenience.
+ *It behaves essentially like the above function.
+ *@param gla Galactic Longitude, expressed as a double.
+ */
+// void setGalLat( double gla ) { galLat.setD( gla ); }
+
+////
+//// 2. Returning coordinates.
+//// =========================
+
+/**@return a pointer to the catalog Right Ascension.
+ */
+ const dms* ra0() const { return &RA0; }
+
+/**@return a pointer to the catalog Declination.
+ */
+ const dms* dec0() const { return &Dec0; }
+
+/**@returns a pointer to the current Right Ascension.
+ */
+ const dms* ra() const { return &RA; }
+
+/**@return a pointer to the current Declination.
+ */
+ const dms* dec() const { return &Dec; }
+
+/**@return a pointer to the current Azimuth.
+ */
+ const dms* az() const { return &Az; }
+
+/**@return a pointer to the current Altitude.
+ */
+ const dms* alt() const { return &Alt; }
+
+/**@return a pointer to the current galactic latitude.
+ */
+// const dms* gLat() const { return &galLat; }
+
+/**@return a pointer to the current galactic longitude.
+ */
+// const dms* gLong() const { return &galLong; }
+
+////
+//// 3. Coordinate conversions.
+//// ==========================
+
+/**Determine the (Altitude, Azimuth) coordinates of the
+ *SkyPoint from its (RA, Dec) coordinates, given the local
+ *sidereal time and the observer's latitude.
+ *@param LST pointer to the local sidereal time
+ *@param lat pointer to the geographic latitude
+ */
+ void EquatorialToHorizontal( const dms* LST, const dms* lat );
+
+/**Determine the (RA, Dec) coordinates of the
+ *SkyPoint from its (Altitude, Azimuth) coordinates, given the local
+ *sidereal time and the observer's latitude.
+ *@param LST pointer to the local sidereal time
+ *@param lat pointer to the geographic latitude
+ */
+ void HorizontalToEquatorial( const dms* LST, const dms* lat );
+
+ /**@short Convert Right Ascension/Declination to Ecliptic logitude/latitude.
+ */
+ void EquatorialToEcliptic( const KSNumbers *num );
+
+ /**@short Convert Ecliptic logitude/latitude to Right Ascension/Declination.
+ */
+
+ void EclipticToEquatorial( const KSNumbers *num );
+
+/**Determine the Ecliptic coordinates of the SkyPoint, given the Julian Date.
+ *The ecliptic coordinates are returned as reference arguments (since
+ *they are not stored internally)
+ */
+ void findEcliptic( const dms *Obliquity, dms &EcLong, dms &EcLat );
+
+/**Set the current (RA, Dec) coordinates of the
+ *SkyPoint, given pointers to its Ecliptic (Long, Lat) coordinates, and
+ *to the current obliquity angle (the angle between the equator and ecliptic).
+ */
+ void setFromEcliptic( const dms *Obliquity, const dms *EcLong, const dms *EcLat );
+
+/** Computes galactic coordinates from equatorial coordinates referred to
+ * epoch 1950. RA and Dec are, therefore assumed to be B1950
+ * coordinates.
+ */
+ void Equatorial1950ToGalactic(dms &galLong, dms &galLat);
+
+/** Computes equatorial coordinates referred to 1950 from galactic ones referred to
+ * epoch B1950. RA and Dec are, therefore assumed to be B1950
+ * coordinates.
+ */
+ void GalacticToEquatorial1950(const dms* galLong, const dms* galLat);
+
+////
+//// 4. Coordinate update/corrections.
+//// =================================
+
+/**Determine the current coordinates (RA, Dec) from the catalog
+ *coordinates (RA0, Dec0), accounting for both precession and nutation.
+ *@param num pointer to KSNumbers object containing current values of
+ *time-dependent variables.
+ *@param includePlanets does nothing in this implementation (see KSPlanetBase::updateCoords()).
+ *@param lat does nothing in this implementation (see KSPlanetBase::updateCoords()).
+ *@param LST does nothing in this implementation (see KSPlanetBase::updateCoords()).
+ */
+ virtual void updateCoords( KSNumbers *num, bool includePlanets=true, const dms *lat=0, const dms *LST=0 );
+
+/**Computes the apparent coordinates for this SkyPoint for any epoch,
+ *accounting for the effects of precession, nutation, and aberration.
+ *Similar to updateCoords(), but the starting epoch need not be
+ *J2000, and the target epoch need not be the present time.
+ *@param jd0 Julian Day which identifies the original epoch
+ *@param jdf Julian Day which identifies the final epoch
+ */
+ void apparentCoord(long double jd0, long double jdf);
+
+/**Determine the effects of nutation for this SkyPoint.
+ *@param num pointer to KSNumbers object containing current values of
+ *time-dependent variables.
+ */
+ void nutate(const KSNumbers *num);
+
+/**Determine the effects of aberration for this SkyPoint.
+ *@param num pointer to KSNumbers object containing current values of
+ *time-dependent variables.
+ */
+ void aberrate(const KSNumbers *num);
+
+/**General case of precession. It precess from an original epoch to a
+ *final epoch. In this case RA0, and Dec0 from SkyPoint object represent
+ *the coordinates for the original epoch and not for J2000, as usual.
+ *@param jd0 Julian Day which identifies the original epoch
+ *@param jdf Julian Day which identifies the final epoch
+ */
+ void precessFromAnyEpoch(long double jd0, long double jdf);
+
+ /** Determine the E-terms of aberration
+ *In the past, the mean places of stars published in catalogs included
+ *the contribution to the aberration due to the ellipticity of the orbit
+ *of the Earth. These terms, known as E-terms were almost constant, and
+ *in the newer catalogs (FK5) are not included. Therefore to convert from
+ *FK4 to FK5 one has to compute these E-terms.
+ */
+ SkyPoint Eterms(void);
+
+ /** Exact precession from Besselian epoch 1950 to epoch J2000. The
+ *coordinates referred to the first epoch are in the
+ FK4 catalog, while the latter are in the Fk5 one.
+ *Reference: Smith, C. A.; Kaplan, G. H.; Hughes, J. A.; Seidelmann,
+ *P. K.; Yallop, B. D.; Hohenkerk, C. Y.
+ *Astronomical Journal, vol. 97, Jan. 1989, p. 265-279
+ *This transformation requires 4 steps:
+ * - Correct E-terms
+ * - Precess from B1950 to 1984, January 1st, 0h, using Newcomb expressions
+ * - Add zero point correction in right ascension for 1984
+ * - Precess from 1984, January 1st, 0h to J2000
+ */
+ void B1950ToJ2000(void);
+
+ /** Exact precession from epoch J2000 Besselian epoch 1950. The coordinates
+ *referred to the first epoch are in the FK4 catalog, while the
+ *latter are in the Fk5 one.
+ *Reference: Smith, C. A.; Kaplan, G. H.; Hughes, J. A.; Seidelmann,
+ *P. K.; Yallop, B. D.; Hohenkerk, C. Y.
+ *Astronomical Journal, vol. 97, Jan. 1989, p. 265-279
+ *This transformation requires 4 steps:
+ * - Precess from J2000 to 1984, January 1st, 0h
+ * - Add zero point correction in right ascension for 1984
+ * - Precess from 1984, January 1st, 0h, to B1950 using Newcomb expressions
+ * - Correct E-terms
+ */
+ void J2000ToB1950(void);
+
+ /** Coordinates in the FK4 catalog include the effect of aberration due
+ *to the ellipticity of the orbit of the Earth. Coordinates in the FK5
+ *catalog do not include these terms. In order to convert from B1950 (FK4)
+ *to actual mean places one has to use this function.
+ */
+ void addEterms(void);
+
+ /** Coordinates in the FK4 catalog include the effect of aberration due
+ *to the ellipticity of the orbit of the Earth. Coordinates in the FK5
+ *catalog do not include these terms. In order to convert from
+ * FK5 coordinates to B1950 (FK4) one has to use this function.
+ */
+ void subtractEterms(void);
+
+ /** Computes the angular distance between two SkyObjects. The algorithm
+ * to compute this distance is:
+ * cos(distance) = sin(d1)*sin(d2) + cos(d1)*cos(d2)*cos(a1-a2)
+ * where a1,d1 are the coordinates of the first object and a2,d2 are
+ * the coordinates of the second object.
+ * However this algorithm is not accurate when the angular separation
+ * is small.
+ * Meeus provides a different algorithm in page 111 which we
+ * implement here.
+ * @param sp SkyPoint to which distance is to be calculated
+ * @return dms angle representing angular separation.
+ **/
+
+ dms angularDistanceTo( SkyPoint *sp);
+
+ bool operator == ( SkyPoint &p ) { return ( ra()->Degrees() == p.ra()->Degrees() && dec()->Degrees() == p.dec()->Degrees() ); }
+
+ /** Computes the velocity of the Sun projected on the direction of the source.
+ *
+ * @param jd Epoch expressed as julian day to which the source coordinates refer to.
+ * @return Radial velocity of the source referred to the barycenter of the solar system in km/s
+ **/
+ double vRSun(long double jd);
+
+ /** Computes the radial velocity of a source referred to the solar system barycenter
+ * from the radial velocity referred to the
+ * Local Standard of Rest, aka known as VLSR. To compute it we need the coordinates of the
+ * source the VLSR and the epoch for the source coordinates.
+ *
+ * @param vlsr radial velocity of the source referred to the LSR in km/s
+ * @param jd Epoch expressed as julian day to which the source coordinates refer to.
+ * @return Radial velocity of the source referred to the barycenter of the solar system in km/s
+ **/
+ double vHeliocentric(double vlsr, long double jd);
+
+ /** Computes the radial velocity of a source referred to the Local Standard of Rest, also known as VLSR
+ * from the radial velocity referred to the solar system barycenter
+ *
+ * @param vhelio radial velocity of the source referred to the LSR in km/s
+ * @param jd Epoch expressed as julian day to which the source coordinates refer to.
+ * @return Radial velocity of the source referred to the barycenter of the solar system in km/s
+ **/
+ double vHelioToVlsr(double vhelio, long double jd);
+
+ /** Computes the velocity of any object projected on the direction of the source.
+ * @param jd0 Julian day for which we compute the direction of the source
+ * @return velocity of the Earth projected on the direction of the source kms-1
+ */
+ double vREarth(long double jd0);
+
+ /** Computes the radial velocity of a source referred to the center of the earth
+ * from the radial velocity referred to the solar system barycenter
+ *
+ * @param vhelio radial velocity of the source referred to the barycenter of the
+ * solar system in km/s
+ * @param jd Epoch expressed as julian day to which the source coordinates refer to.
+ * @return Radial velocity of the source referred to the center of the Earth in km/s
+ **/
+ double vGeocentric(double vhelio, long double jd);
+
+ /** Computes the radial velocity of a source referred to the solar system barycenter
+ * from the velocity referred to the center of the earth
+ *
+ * @param vgeo radial velocity of the source referred to the center of the Earth
+ * [km/s]
+ * @param jd Epoch expressed as julian day to which the source coordinates refer to.
+ * @return Radial velocity of the source referred to the solar system barycenter in km/s
+ **/
+ double vGeoToVHelio(double vgeo, long double jd);
+
+ /** Computes the velocity of any object (oberver's site) projected on the
+ * direction of the source.
+ * @param vsite velocity of that object in cartesian coordinates
+ * @return velocity of the object projected on the direction of the source kms-1
+ */
+ double vRSite(double vsite[3]);
+
+ /** Computes the radial velocity of a source referred to the observer site on the surface
+ * of the earth from the geocentric velovity and the velocity of the site referred to the center
+ * of the Earth.
+ *
+ * @param vgeo radial velocity of the source referred to the center of the earth in km/s
+ * @param vsite Velocity at which the observer moves referred to the center of the earth.
+ * @return Radial velocity of the source referred to the observer's site in km/s
+ **/
+ double vTopocentric(double vgeo, double vsite[3]);
+
+ /** Computes the radial velocity of a source referred to the center of the Earth from
+ * the radial velocity referred to an observer site on the surface of the earth
+ *
+ * @param vtopo radial velocity of the source referred to the observer's site in km/s
+ * @param vsite Velocity at which the observer moves referred to the center of the earth.
+ * @return Radial velocity of the source referred the center of the earth in km/s
+ **/
+ double vTopoToVGeo(double vtopo, double vsite[3]);
+
+////
+//// 5. Calculating Rise/Set/Transit data.
+//// =====================================
+
+//// To Be Moved from SkyObject....
+
+////
+//// 6. Constellation Identification
+//// =====================================
+
+ QString constellation( QPtrList<CSegment> &seglist, QPtrList<SkyObject> &cnames ) const;
+
+
+protected:
+/**Precess this SkyPoint's catalog coordinates to the epoch described by the
+ *given KSNumbers object.
+ *@param num pointer to a KSNumbers object describing the target epoch.
+ */
+ void precess(const KSNumbers *num);
+
+
+private:
+ dms RA0, Dec0; //catalog coordinates
+ dms RA, Dec; //current true sky coordinates
+ dms Alt, Az;
+};
+
+#endif