如何绘制天空图?

Bog*_*dan 4 javascript algorithm formula astronomy

如何画像星图这个

我有:

  1. 带坐标的星型数据库(右上升和下降)
  2. 观察者坐标(纬度,经度)
  3. 观察时间

我需要一个考虑这些参数的公式.

Spe*_*tre 10

  1. 恒星数据库

    谷歌:

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

    您可以编译许多站点所需的轨道参数.你需要所有这些Orbital_elements,例如这里有一些

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

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

    M=E-e*sin(E)
    
    Run Code Online (Sandbox Code Playgroud)

    哪里:


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

    你可以像这样解决它:

    for (E=M,q=0;q<20;q++) E=M+e*sin(E);
    
    Run Code Online (Sandbox Code Playgroud)

    现在你知道EM你需要的任何东西.只需计算椭圆上的位置并按倾斜度旋转即可.该M计算也只是简单地你需要知道时间t0时,地球交叉角为0则:

    M = (t-t0) * dM
    
    Run Code Online (Sandbox Code Playgroud)

    这里dM是围绕太阳旋转 如果时间是几天,那么dM就在[rad/day].对地球而言2.0*pi/tropical_year.这将引导您到所有行星的全球位置(相对于太阳)

    开普勒

    有关更多信息,请参见此处如何计算行星位置

  4. 地球视图

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

[笔记]

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

  • 地球 tropical_year = 365.242195601852 days
  • 地球的一天轮换 dM = 0.0172021242603194 rad/day
  • 一天是太阳日!就像朱利安约会...

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

[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();
    }
//---------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

第一个函数计算开普勒日心轨迹上的二维位置(x,y),同时a>=b是半轴,并且M是平均角度(线性角度像时间缩放到<0,2*Pi>每年一次的旋转).第二个函数只是使用VCL/GDI渲染椭圆,因此很清楚如何使用第一个使用恒定时间步长的椭圆,因此可以看到近地区的行星移动得更快...