4

このような星図を描くにはどうすればよいですか?

私は持っている:

  1. 星の座標(赤経赤緯)データベース
  2. 観測者座標 (緯度、経度)
  3. 観測時間

これらのパラメータを考慮した式が必要です。

4

1 に答える 1

14
  1. 恒星データベース

    グーグル:

    • BSC (Bright star catalog) +6.5 等までの ~10,000 個の星 (肉眼)
    • ヒッパルコス ~ 118K の星で最大 +12 等 (望遠鏡) で、視差 (3D 座標) などがあります。
    • ヒッパルコスは私のお気に入りです。両方とも、グーグルだけで多くのAstornomyサーバーからASCII形式で自由にダウンロードできます...
  2. 惑星(天体)

    多くのサイトから必要な軌道パラメーターをコンパイルできます。これらのOrbital_elementsのすべてが必要になります。たとえば、ここにいくつかあります

  3. シミュレーション (時間内の位置を計算)

    惑星の場合、これは惑星/衛星のエフェメリスを取得するだけで、ケプラー方程式を計算することで実行できます

    M=E-e*sin(E)
    

    どこ:


    Mは平均角 (あたかも惑星が円形の軌道を持ち、速度が一定であるかのように)
    Eは楕円の中心からの実角 (ケプラーの法則を考慮した場合) です。

    次のように解決できます。

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

    Eこれで、どれが必要かがわかりましMた。楕円上の位置を計算し、傾きで回転させるだけです。また、惑星が角度 0 を横切るM時間を知る必要があるだけで、単純に計算されます。t0

    M = (t-t0) * dM
    

    dM太陽の周りの回転はどこですか. 時間が日数の場合、dMは です[rad/day]。地球の場合は2.0*pi/tropical_yearです。これにより、すべての惑星のグローバル位置 (太陽に相対的) に移動します。

    ケプラー

    詳細については、ここを参照してください。惑星の位置を計算する方法

  4. アースビュー

    赤道座標は地球を基準としているため、地球の毎日の回転をシミュレーションに追加する必要があります。23.5 deg1 つの軸を「右」方向に回転させた変換行列を作成し、この軸による回転を追加するだけです。また、地理的位置に回転を追加します。この後、この行列を計算された地球の位置に変換します。これから、すべてのグローバル座標を地球のビューに簡単に変換できるため、データを画像/画面にプロットできます。

[ノート]

使用するローテーション期間に注意してください!!!

  • 地球の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();
    }
//---------------------------------------------------------------------------

最初の関数は、ケプラー太陽中心軌道上の2D位置を計算しますが、は半軸であり、平均角度 ( 1 年あたりの回転にスケーリングされた時間のような直線角度) です。2 番目の関数は、 VCL/GDIを使用して楕円をレンダリングするだけなので、一定の時間ステップを使用して最初の関数を使用する方法が明確になり、近日点の近くで惑星がより速く移動することがわかります...(x,y)a>=bM<0,2*Pi>

于 2014-08-20T11:22:12.920 に答える