Как нарисовать карту звездного неба?

Как нарисовать звездную карту, подобную этой ?

У меня есть:

  1. База данных звезд с координатами (прямое восхождение и склонение)
  2. Координаты наблюдателя (широта, долгота)
  3. Время наблюдения

Мне нужна формула, учитывающая эти параметры.


person Bogdan    schedule 10.03.2012    source источник


Ответы (1)


  1. звездная база данных

    гугл для:

    • BSC (Bright star catalog) ~10K stars up to +6.5 mag (naked eye)
    • Hipparcos ~ 118K звезд до +12 звездной величины (телескопы), а также имеет параллакс (3D-координаты) и многое другое.
    • Гиппаркос мой фаворит. оба можно бесплатно загрузить в формате ASCII со многих серверов Astornomy, просто погуглите...
  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, и это все, что вам нужно. Просто вычислите положение на эллипсе и поверните его по наклону. M вычисляется также просто, вам нужно знать время t0, когда угол пересечения планеты равен 0. Тогда:

    M = (t-t0) * dM
    

    где dM — вращение вокруг Солнца. Если время указано в днях, то dM находится в [rad/day]. Для Земли это 2.0*pi/tropical_year. Это приведет вас к глобальным позициям всех планет (относительно Солнца).

    Кеплер

    Для получения дополнительной информации см. здесь Как вычислить положение планет

  4. Земля

    Экваториальные координаты относятся к Земле, поэтому вам нужно добавить дневное вращение Земли в вашу симуляцию. Просто создайте матрицу преобразования с одной осью, повернутой на 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, так что понятно, как использовать первую, используя постоянный шаг по времени, чтобы было видно вблизи перигелия планета движется быстрее...

person Spektre    schedule 20.08.2014