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.
499 lines
18 KiB
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) andQt::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
|