Как нарисовать звездную карту, подобную этой ?
У меня есть:
- База данных звезд с координатами (прямое восхождение и склонение)
- Координаты наблюдателя (широта, долгота)
- Время наблюдения
Мне нужна формула, учитывающая эти параметры.
Как нарисовать звездную карту, подобную этой ?
У меня есть:
Мне нужна формула, учитывающая эти параметры.
звездная база данных
гугл для:
планеты (тела)
Вы можете собрать необходимые орбитальные параметры со многих сайтов. Вам понадобятся все эти 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
день средний солнечный день !!! прямо как юлианское свидание...
Всегда калибруйте свои данные с помощью другого программного обеспечения или реального устройства. Есть некоторые библиотеки, которые делают все это, просто 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();
}
//---------------------------------------------------------------------------
Первая функция вычисляет 2D положение (x,y)
на кеплеровской гелиоцентрической траектории, где a>=b
— это полуоси, а M
— средний угол (линейный угол, подобный времени, масштабированному до <0,2*Pi>
за годовой оборот). Вторая функция просто визуализирует эллипс с помощью VCL/GDI, так что понятно, как использовать первую, используя постоянный шаг по времени, чтобы было видно вблизи перигелия планета движется быстрее...