太阳系控件TSolarSystem
class PACKAGE TSolarSystem : public TComponent
算法和主要程序选自http://www.moshier.net/index.html并改写
物理观测数据算法选自Jean Meeus :astronomical algorithm
调用了外部自定义的3个类
1、天球坐标系类:class astro_coord
public:
double epsiln(long double J); //返回黄赤交角
void nutate(long double J); //计算章动量,通过nutl,nuto返回
void setpec(sky_sph pec, long double J); //设置J下黄道极坐标
void setrec(sky_vector rec, long double J); //设置J下黄道直角坐标
sky_sph getpec2k(void); //返回J2000下黄道坐标
sky_sph getpecj(long double J); //返回J下黄道坐标
sky_sph getmeanpeq(void); //返回J平春分点下赤道坐标
sky_sph gettruepec(void); //pseudo,返回真黄道坐标,平位置加黄经章动,
sky_sph gettruepeq(void); //返回真赤道坐标,平位置加黄经章动,真黄赤交角
sky_vector rec2req(sky_vector rec, double e); //黄道坐标转赤道坐标
sky_vector req2rec(sky_vector req, double e); //赤道坐标转黄道坐标
double nutl; // nutation in longitude (radians) 章动量
double nuto; // nutation in obliquity (radians) 章动量
2、天文时间类 class astro_time{
public:
long double jd; //设置儒略日(UT)
astro_date getut(void); //返回UT
astro_date getbt(void); //返回BT
void setut(astro_date adad); //设置UT
void setbt(astro_date adad); //设置BT
double getdt(void); //返回deltaT
long double gettdt(void); //返回儒略日(TDT)
3、观测地点类
元件由以下单元组成
1)大行星日心黄道坐标级数展开系数
getpec2k(J)调用class_pertub (原程序中gplan)求出J时刻J2000的日心黄道极坐标:
class_mercury.cpp
class_venus.cpp
class_uranus.cpp
class_neptune.cpp
class_pluto.cpp
class_mars.cpp
phy_mars(long double J,sky_sph ehecj,sky_sph mhecj,double t,sky_sph mgecj,sky_sph sgeqj, double res[8] )
火星物理观测参数。
输入:
地球相对当日平春分点的日心坐标:ehecj=hpecj[nearth];
火星在T-tme时刻相对当日平春分点的日心坐标:mhecj=hpecj[nmars];
火星到地球的光行时:t=jabe[nmars];
火星在T-tme的地心黄道坐标:mgecj=gpecj[nmars];
太阳在T-tse的地心真赤道坐标: 注意为单位向量 sgeqj=gpeqa[nearth];
返回:(角度单位均为度)
res[0]=DE;
res[1]=DS;
res[2]=LS;
res[3]=P;
res[4]=Q;
res[5]=k;
res[6]=CM;
res[7]=d;
其中:
double DE; //从火星中心观察到的地球的赤纬。当DE为正时,从地球上能观察到火星的北极。
double DS; //从火星中心观察到的太阳的赤纬。当DS为正时,火星的北极被照亮。
double P; //火星自转轴的位置角。自火星视面北点起向东计量。
double LS; //火心太阳黄经,从火星春分点起算
double Q; //暗缘中心点的位置角。自火星视面北点起向东计量。
double CM,w; //从地心观察到的火星视面中央点经度
double d; //视直径
double k; //明暗比
class_jupiter.cpp
phy_jupiter(long double J,sky_sph ehpecj,double res[8])//木星物理观测参数
输入:
地球相对当日平春分点的日心坐标: ehpecj=hpecj[nearth]
返回:
res[0]=DE;
res[1]=DS;
res[3]=P;
res[4]=W1;
res[5]=W2;
res[6]=C;
res[7]=d;
其中:
double DE; //木心地球赤纬。当DE为正时,从地球上能观察到木星的北极。
double DS; //木心太阳赤纬。当DS为正时,木星的北极被照亮。
double P; //自转轴的位置角。自视面北点起向东计量。
double W1,W2; //从地心观察到的星视面中央点经度
double k; //明暗比
double C; //相位改正C(度)
jupsat(long double J,sky_sph jgpecj,sky_vector sv[5])//木星伽利略卫星位置
输入:
木星J-t的地心黄道j平坐标 jgpecj
返回:
sv[0]:木星自转轴指向
,无投影改正
sv[1-4]:木卫直角坐标,单位:木星半长径。x,y经投影改正
class_saturn.cpp
void phy_saturn(long double J, sky_sph shpecj,sky_sph sgpecj,sky_sph ehpecj,double res[8])
土星物理观测参数
输入:
地球相对当日平春分点的日心黄道坐标 : ehpecj
土星在J-tsae观测时刻相对当日平春分点的日心黄道坐标: shpecj
土星的J-tsae地心黄道坐标: sgpecj
返回:
res[0]=Be; 从土星中心观察到的地球的纬度(度)
res[1]=Bs;//从土星中心观察到的太阳的纬度(度)
res[2]=0;
res[3]=P;//光环视椭圆半短径的位置角(度)
res[4]=ra;//外环、本体视椭圆的长径和短径(角秒)
res[5]=rb;
res[6]=rp;
res[7]=re;
Graphics::TBitmap * view(double res[8]);
土星视图
输入:
物理观测参数res[8],同上
返回:
位图句柄
2)地月坐标级数展开系数, 调用class_planet(原程序中g3plan)计算级数和。
class_earth.cpp
sky_sph getpec2k(J);//J时刻J2000的日心黄道极坐标
void phy_moon(long double J, double res[8]);//J时刻月球物理观测数据
返回:
res[0]//地球的赤纬(度)
res[1]//太阳的赤纬(度)
res[2]//太阳赤经(度)
res[3]=P;//北极位置角P(度)
res[4]=Q;//暗缘中心点的位置角(度)
res[5]=k;//明暗比
res[6]//中央经度(度)
res[7]//张角(角秒)
class_moon.cpp
sky_sph getpecj(long double J);//J时刻J下的地心黄道极坐标
sky_vector * moonlib(long double J);//J下黄道坐标到月球坐标的转换矩阵
3)彗星、小行星历表计算
get_pec2k(long double J,orbit obt)输入轨道根数求解开普勒方程计算J2000下的日心黄道坐标
class_comet.cpp
class_asteroid.cpp
4)太阳系内大行星、彗星、小行星位置和物理观测参数计算
class_solar.cpp
public:
void update(long double J);//计算J时刻大行星位置
大行星,月亮坐标(nearth=0,nmer=1,nven=2,nmars=3,njup=4,nsat=5,nura=6,nnep=7,nplu=8,nmoon=9)。
命名规则:h/g:日心/地心;r/p:直角/球坐标;ec/eq:黄道/赤道坐标;2k/j/t/a:J2000平位置/J平位置/真位置/视位置
在执行update()后下列变量有效:
sky_sph hpec2k[10]; //no moon
sky_sph gpeq2k[10];
sky_sph hpecj[10];
sky_sph gpecj[10];
sky_sph hpect[10];
sky_sph gpect[10];
sky_sph gpeca[10]; //pseudo,no definition for apparent ecliptic position
sky_sph gpeqa[10];
sky_sph gpeqt[10];
sky_sph gpec[10]; //=peca
sky_sph gpeq[10]; //=peqa
sky_sph get_comet_gpeqa(long double J,double res[8],cmtorbit iobt);
sky_sph get_ast_gpeqa(long double J,double res[8],astorbit iobt);
//J时刻彗星、小行星视位置
输入:
轨道根数obt
返回:
gpeqa:地心赤道视位置(向径无效)
res[0]; //J-t时日心距离
res[1]; //地心距离
res[2]; //太阳距角(弧度)
res[3]; //亮度
计算彗星、小行星位置后下列变量有效:
sky_sph cmtgpeq2k; //彗星
sky_sph astgpeq2k; //小行星
sky_sph getstar(sky_sph star, long double epoch, long double J);//恒星视位置改正
输入:
赤道坐标star
星表历元epoch
观测时刻J
返回:
恒星视位置赤道坐标
Graphics::TBitmap * view(double res[8], AnsiString fname,double scale,int longdir);//行星视图
输入:
物理观测数据res,包括
res[0]//地球的赤纬(度)
res[1]//void
res[2]//void
res[3]=P;//北极位置角P(度)
res[4]=Q;//暗缘中心点的位置角(度)
res[5]=k;//明暗比
res[6]//中央经度(度)
res[7]//张角(角秒)
fname:720x360行星表面图片文件名。
scale:视图直径所代表的张角。负值表示视图直径即为行星视直径。
longdir:行星表面经度方向。向东计量+1,向西-1。
返回:
181x181位图句柄。
void get_sun_phy(long double J, double res[8]);//太阳物理观测数据
返回:
res[0]=B0;//中心纬度
res[1]=J0;//自转周起点
res[2]=0;
res[3]=P;//方位角
res[4]=0;
res[5]=1;
res[6]=L0;//中心经度
res[7]=C;//自转周号
void get_moon_phy(long double J, double res[8]);
Graphics::TBitmap * get_moon_phy(long double J, double res[8], AnsiString str);
输入:
月面图文件名str
返回:
月亮物理观测数据(同class_earth.cpp)
月亮视图(图直径2000角秒)
void get_mars_phy(long double J,double res[8]);//火星物理观测数据
Graphics::TBitmap * get_mars_phy(long double J,double res[8],AnsiString str);//火星物理观测数据和视图
输入:
火星表面图文件名str
返回:
火星物理观测数据(同class_mars.cpp)
火星视图(图直径27角秒)
void get_jup_phy(long double J, double res[8]);//木星物理观测数据,同class_jupiter.cpp
void get_jup_sat(long double J, sky_vector res[5]);//木星伽利略卫星位置
Graphics::TBitmap * get_jup_sat_phy(long double J,sky_vector res[5]);
返回:
res同class_jupiter.cpp
木星及木卫视图(忽略DE效应)
Graphics::TBitmap * get_mer_ven_phy(long double J, double res[8],int nplanet);//水星,金星视图
返回:
物理观测数据,包括
res[0]=0;
res[1]=0;
res[2]//太阳距角(度)
res[3]//=0;
res[4]//暗缘中心点位置角(度)
res[5]//明暗比
res[6]=0;
res[7]//视直径(角秒)
行星视图(图直径60角秒)
Graphics::TBitmap * get_sat_phy(long double J, double res[8]);
//土星物理观测数据和视图
返回:
土星物理观测数据(同class_saturn.cpp),res[2]://太阳距角(度)
土星视图
5)元件调用
public:
astro_solarsys *solarsys;
|