📄 observe.cpp
字号:
#include <math.h>
#include "observe.h"
/* Assorted functions useful in conjunction with the satellite code
library for determining where the _observer_, as well as the _target_,
happens to be. Combine the two positions, and you can get the
distance/RA/dec of the target as seen by the observer. */
#define PI 3.141592653589793238462643383279
#define EARTH_MAJOR_AXIS 6378140.
#define EARTH_MINOR_AXIS 6356755.
#define EARTH_AXIS_RATIO (EARTH_MINOR_AXIS / EARTH_MAJOR_AXIS)
/* function for Greenwich sidereal time, ripped from 'deep.cpp' */
static double ThetaG( double jd)
{
/* Reference: The 1992 Astronomical Almanac, page B6. */
const double omega_E = 1.00273790934;
/* Earth rotations per sidereal day (non-constant) */
const double UT = fmod( jd + .5, 1.);
double t_cen, GMST, rval;
t_cen = (jd - UT - 2451545.0) / 36525.;
GMST = 24110.54841 + t_cen * (8640184.812866 + t_cen *
(0.093104 - t_cen * 6.2E-6));
GMST = fmod( GMST + 86400. * omega_E * UT, 86400.);
if( GMST < 0.)
GMST += 86400.;
rval = 2. * PI * GMST / 86400.;
return( rval);
} /*Function thetag*/
void DLL_FUNC observer_cartesian_coords( const double jd, const double lon,
const double rho_cos_phi, const double rho_sin_phi,
double *vect)
{
const double angle = lon + ThetaG( jd);
*vect++ = cos( angle) * rho_cos_phi * EARTH_MAJOR_AXIS / 1000.;
*vect++ = sin( angle) * rho_cos_phi * EARTH_MAJOR_AXIS / 1000.;
*vect++ = rho_sin_phi * EARTH_MAJOR_AXIS / 1000.;
}
void DLL_FUNC lat_alt_to_parallax( const double lat, const double ht_in_meters,
double *rho_cos_phi, double *rho_sin_phi)
{
const double u = atan( sin( lat) * EARTH_AXIS_RATIO / cos( lat));
*rho_sin_phi = EARTH_AXIS_RATIO * sin( u) +
(ht_in_meters / EARTH_MAJOR_AXIS) * sin( lat);
*rho_cos_phi = cos( u) + (ht_in_meters / EARTH_MAJOR_AXIS) * cos( lat);
}
void DLL_FUNC get_satellite_ra_dec_delta( const double *observer_loc,
const double *satellite_loc, double *ra,
double *dec, double *delta)
{
double vect[3], dist2 = 0.;
int i;
for( i = 0; i < 3; i++)
{
vect[i] = satellite_loc[i] - observer_loc[i];
dist2 += vect[i] * vect[i];
}
*delta = sqrt( dist2);
*ra = atan2( vect[1], vect[0]);
if( *ra < 0.)
*ra += PI + PI;
*dec = asin( vect[2] / *delta);
}
void DLL_FUNC epoch_of_date_to_j2000( const double jd, double *ra, double *dec)
{
const double t_centuries = (jd - 2451545.) / 36525.;
const double m = (3.07496 + .00186 * t_centuries / 2.) * (PI / 180.) / 240.;
const double n = (1.33621 - .00057 * t_centuries / 2.) * (PI / 180.) / 240.;
const double ra_rate = m + n * sin( *ra) * tan( *dec);
const double dec_rate = n * cos( *ra);
*ra -= t_centuries * ra_rate * 100.;
*dec -= t_centuries * dec_rate * 100.;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -