このような星図を描くにはどうすればよいですか?
私は持っている:
- 星の座標(赤経赤緯)データベース
- 観測者座標 (緯度、経度)
- 観測時間
これらのパラメータを考慮した式が必要です。
恒星データベース
グーグル:
惑星(天体)
多くのサイトから必要な軌道パラメーターをコンパイルできます。これらのOrbital_elementsのすべてが必要になります。たとえば、ここにいくつかあります
シミュレーション (時間内の位置を計算)
惑星の場合、これは惑星/衛星のエフェメリスを取得するだけで、ケプラー方程式を計算することで実行できます
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
です。これにより、すべての惑星のグローバル位置 (太陽に相対的) に移動します。
詳細については、ここを参照してください。惑星の位置を計算する方法
アースビュー
赤道座標は地球を基準としているため、地球の毎日の回転をシミュレーションに追加する必要があります。23.5 deg
1 つの軸を「右」方向に回転させた変換行列を作成し、この軸による回転を追加するだけです。また、地理的位置に回転を追加します。この後、この行列を計算された地球の位置に変換します。これから、すべてのグローバル座標を地球のビューに簡単に変換できるため、データを画像/画面にプロットできます。
[ノート]
使用するローテーション期間に注意してください!!!
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>=b
M
<0,2*Pi>