如何绘制天空图?
恒星数据库
谷歌搜索:
- BSC(亮星目录)~10K 颗星,高达 +6.5 mag(肉眼)
- Hipparcos ~118K 星,高达 +12 mag(望远镜)并且还有视差(3D 坐标)等等
- Hipparcos 是我的最爱。两者都可以从许多天文服务器以ASCII格式免费下载,只是谷歌......
行星(物体)
您可以从许多站点编译所需的轨道参数。您将需要所有这些Orbital_elements例如这里有一些
模拟(及时计算位置)
对于行星,这只是获得行星/卫星的星历,这可以通过计算开普勒方程来完成
M=E-e*sin(E)
在哪里:
M
是平均角度(好像行星具有圆形轨迹和恒定速度)
E
是与椭圆中心的真实角度(考虑开普勒定律)你可以这样解决:
for (E=M,q=0;q<20;q++) E=M+e*sin(E);
现在你知道
E
任何M
这是你所需要的。只需计算椭圆上的位置并通过倾斜旋转它。该M
也被计算只是简单地你需要知道时间t0
时,地球交叉角为0则:M = (t-t0) * dM
哪里
dM
是围绕太阳旋转。如果时间以天dM
为单位,则为[rad/day]
。对于地球来说是2.0*pi/tropical_year
。这将引导您到所有行星的全球位置(相对于太阳)有关更多信息,请查看此处如何计算行星位置
地球视图
赤道坐标是相对于地球的,因此您需要将地球的每日自转添加到您的模拟中。只需创建一个轴
23.5 deg
在“右”方向旋转的变换矩阵,并通过该轴添加旋转。还要为您的地理位置添加旋转。在此之后,将此矩阵转换为计算出的地球位置。由此很容易将所有全局坐标转换为地球视图,因此您现在可以将数据绘制到图像/屏幕上。
[笔记]
请注意您使用的轮换周期!!!
- 地球的
tropical_year = 365.242195601852 days
- 地球日自转
dM = 0.0172021242603194 rad/day
这一天是平均太阳日!!!就像朱利安约会...
始终使用其他软件或实物校准您的数据。有一些库可以完成所有这些工作,只是谷歌。为了提高精度,执行章动、进动和轨道参数随时间变化。
[Edit1] 简单的 C++ 示例
我简化了完整的 C++ 示例,所以只a,b,M
使用了。
//---------------------------------------------------------------------------
void ellipse_kepler(double &x,double &y,double a,double b,double M)
{
int q;
double c1,c2,e,E,V,r;
e=1.0-((b*b)/(a*a)); // eccentricity
if (e>=1.0) e=0; // wrong e
c1=sqrt((1.0+e)/(1.0-e)); // some helper constants computation
c2=a*(1-e*e);
//b=a*sqrt(1.0-e);
for (E=M,q=0;q<20;q++) E=M+e*sin(E);// Kepler's equation
V=2.0*atan(c1*tan(E/2.0));
r=c2/(1.0+e*cos(V));
x=r*cos(V); // heliocentric ellipse
y=r*sin(V);
}
//---------------------------------------------------------------------------
void draw()
{
scr.cls(clBlack);
double x0,y0,x,y,a,b,M,r=5;
// ellipse
x0=scr.xs>>1;
y0=scr.ys>>1;
a=(x0*75)/100;
b=(y0*35)/100;
x0+=1.5*(a-b);
scr.bmp->Canvas->Pen->Color=clAqua;
for (M=0.0;M<=2.0*M_PI;M+=M_PI*0.01) // small step so the ellipse trajectory is not edgy
{
ellipse_kepler(x,y,a,b,M);
x+=x0; y+=y0;
if (M<=1e-10) scr.bmp->Canvas->MoveTo(x,y);
else scr.bmp->Canvas->LineTo(x,y);
}
scr.bmp->Canvas->Pen->Color=clAqua;
scr.bmp->Canvas->Brush->Color=clYellow;
scr.bmp->Canvas->Ellipse(x0-r,y0-r,x0+r,y0+r);
scr.bmp->Canvas->Brush->Color=clBlue;
for (M=0.0;M<=2.0*M_PI;M+=M_PI*0.05) // constant time step for the dots a bit bigger so not many dots are on one place
{
ellipse_kepler(x,y,a,b,M);
x+=x0; y+=y0;
scr.bmp->Canvas->Ellipse(x-r,y-r,x+r,y+r);
}
scr.rfs();
}
//---------------------------------------------------------------------------
第一个函数计算开普勒日心轨迹上的二维位置(x,y)
,同时a>=b
是半轴和M
平均角度(线性角度,如时间缩放到<0,2*Pi>
每年旋转)。第二个函数只是用VCL/GDI渲染椭圆,所以很清楚如何使用第一个使用恒定时间步长,这样可以在近日点附近看到行星移动得更快......