You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/kstars/kstars/skypoint.h

499 lines
18 KiB

/***************************************************************************
skypoint.h - Trinity 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 <tqstring.h>
#include <tqptrlist.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
//// =====================================
TQString constellation( TQPtrList<CSegment> &seglist, TQPtrList<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