如何绘制天空图?

时间:2012-03-10 12:20:01

标签: javascript algorithm formula astronomy

如何绘制像this这样的星图?

我有:

  1. 具有坐标(右上升和下降)的星型数据库
  2. 观察者坐标(纬度,经度)
  3. 观察时间
  4. 我需要一个考虑这些参数的公式。

1 个答案:

答案 0 :(得分:9)

  1. 恒星数据库

    google for:

    • BSC (明星目录)~10K星达+6.5 mag(肉眼)
    • Hipparcos~118K星达到+12 mag(望远镜)并且还有视差(3D坐标)等等
    • Hipparcos是我的最爱。两者都可以从许多Astornomy服务器中以 ASCII 格式免费下载,只需google ...
  2. 行星(身体)

    您可以编译许多站点所需的轨道参数。您将需要所有这些Orbital_elements,例如here

  3. 模拟(计算时间位置)

    对于行星而言,这只是获得行星/卫星的星历,可以通过计算开普勒方程来完成

    M=E-e*sin(E)
    

    其中:


    M是平均角度(好像行星具有圆形轨迹和恒定速度)
    E是椭圆中心的实际角度(考虑到开普勒定律)

    你可以这样解决:

    for (E=M,q=0;q<20;q++) E=M+e*sin(E);
    

    现在您知道任何E的{​​{1}},这就是您所需要的。只需计算椭圆上的位置并按倾斜度旋转即可。 M的计算也只是在行星交叉角为0时需要知道时间M。然后:

    t0

    其中M = (t-t0) * dM 围绕Sun旋转。如果时间是几天,则dM位于dM。对于地球,它是[rad/day]。这将引导您到所有行星的全球位置(相对于太阳)

    Kepler

    有关详细信息,请查看How to compute planetary positions

  4. 地球视图

    赤道坐标相对于地球,因此您需要在模拟中添加地球的每日旋转。只需创建变换矩阵,其中一个轴在“右”方向上旋转2.0*pi/tropical_year,并通过此轴添加旋转。还要为地理位置添加旋转。在此之后,将此矩阵转换为计算地球的位置。从中可以很容易地将所有全局坐标转换为地球视图,这样您就可以将数据绘制成图像/屏幕。

  5. <强> [注释]

    小心你使用的旋转周期!!!

    • 地球的23.5 deg
    • 地球日轮换tropical_year = 365.242195601852 days
    • 日是太阳日!就像朱利安约会......

      始终使用其他软件或真实内容校准您的数据。有一些libs只是google所有这些。为了提高精度,实施章动,进动和轨道参数随时间而变化。

    [Edit1]简单的C ++示例

    我简化了full C++ example,因此只使用了dM = 0.0172021242603194 rad/day

    screenshot

    a,b,M

    第一个函数在开普勒日心中轨迹上计算 2D 位置//--------------------------------------------------------------------------- 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是平均角度(线性角度与时间缩放到{每年革命{1}}。第二个函数只是用 VCL / GDI 渲染椭圆,所以很清楚如何使用第一个使用恒定时间步长的椭圆,这样就可以看到近地点附近行星运动得更快...