Телескопы покупают здесь


A A A A Автор Тема: Помогите программисту  (Прочитано 4102 раз)

0 Пользователей и 1 Гость просматривают эту тему.

engineeer

  • Гость
Помогите программисту
« : 06 Мар 2006 [08:24:37] »
Есть база данных звезд, включающая название, созвездие, видимая звездная величина, расстояние от Земли, координаты на небосклоне: прямое восхождение(ч., мин.) и склонение(град., мин.). Нужно сделать поиск видимых созвездий и звезд в заданной точке Земного  шара в данное время. Подскажите, пожалуйста, алгоритм.

Оффлайн Ivan Mhitarov

  • Модератор
  • *****
  • Сообщений: 6 229
  • Благодарностей: 108
  • Награды Неоднократный победитель конкурса астрофото
    • Сообщения от Ivan Mhitarov
Re: Помогите программисту
« Ответ #1 : 06 Мар 2006 [09:56:38] »
Для определения условия видимости нужны только координаты объекта.
Далее нужно копать в сторону преобразования экваториальных координат (из каталога) в азимутальные (азимут и высота).
Если высота > 0 значит звезда видна.
Иван Мхитаров
Кубанский Астрономический Клуб "45".

engineeer

  • Гость
Re: Помогите программисту
« Ответ #2 : 06 Мар 2006 [13:28:29] »
Спасибо. Формулы я нашел, только там вместо прямого восхождения используется часовой угол, а формулы для перевода я не нашел. И еще не могу понять как мне использовать вводимые координаты точки Земного шара и время?

Оффлайн xd

  • *****
  • Сообщений: 17 977
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Re: Помогите программисту
« Ответ #3 : 06 Мар 2006 [17:09:25] »
Прямое восхождение связано с часовым углом через звёздное время, которое зависит от солнечного времени и долготы точки наблюдения, а широта фигурирует в расчётах высоты над горизонтом.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн AstroNick

  • *****
  • Сообщений: 3 135
  • Благодарностей: 121
  • Дорогу осилит идущий!
    • Сообщения от AstroNick
    • Домашняя страничка "Остров сокровищ"
Re: Помогите программисту
« Ответ #4 : 06 Мар 2006 [17:12:08] »
Спасибо. Формулы я нашел, только там вместо прямого восхождения используется часовой угол, а формулы для перевода я не нашел. И еще не могу понять как мне использовать вводимые координаты точки Земного шара и время?

Часовой угол связан с прямым восхождением через звёздное время (и звёздное время, и часовой угол зависят от обычного времени). Формулы есть, например, тут. Конечно, сразу возникнет вопрос - откуда взять звёздное время? Ответ: либо из ежегодников и прочих астрономических календарей, либо вычислять по мере надобности. А географические координаты входят в формулы перехода между горизонтальными и экваториальными координатами.
Александрович Николай, Москва - юг Подмосковья, АстроТоп России, 300-мм F/6 Ньютон + Celestron Advanced C8-SGT в обсерватории под Москвой, ТАЛ-1, DeepSky 25x100, SW1201+Coronado PST, Canon EOS 6D

Andreichk

  • Гость
Re: Помогите программисту
« Ответ #5 : 06 Мар 2006 [17:16:47] »
//##################################################################
//###########   РАСЧЁТ ТОЧНОГО ЗВЁЗДНОГО ВРЕМЕНИ   ###############
//##################################################################
float sternh,sternm,sterns;
function Sidereal_time(float Lon,float jahr, float monat, float tag,
float stunde, float minute, float sekunde)returns float//,
{float s, b, j, h, g, t,sternmx,gmt ;string q;q="";
stunde=stunde-sommer_winter;// -2- ЛЕТОМ,-1-ЗИМОЙ.
gmt=stunde+minute/60.0+sekunde/3600.0;
if (monat < 3)
{jahr=jahr-1;monat=monat+12;}
s = jahr + monat / 100.0 + tag / 1000.0;
if (s < 1583.1015)b=-2;
else b = math.floor(jahr/400.0)-math.floor(jahr/100.0);
j = 365.25*jahr+math.floor(30.6001*(monat+1))+b+tag+1720996.5;
t = (j - 2451545.0) / 36525.0;
g = 0.2790572733 + 100.0021391 * t + 0.0000010776 * t * t
                                 - 0.000000000072 * t * t* t;
g = g + 0.0417807462 * gmt;
g = (g - math.floor(g)) * 24.0;
h = g + Lon/15.4320;//ЗДЕСЬ ВВОДИМ ДОЛГОТУ
h = h - 24*math.floor(h/24.0);
sternh = math.floor(h);
sternmx= (h-math.floor(h))*60.0;
sternm = math.floor(sternmx);
sterns = math.floor((sternmx-math.floor(sternmx))*60.0);
return sternh+sternm/60+sterns/3600;//В ЧАСАХ И ДОЛЯХ ЧАСА
}//----------------OK

Оффлайн Darsel

  • Новичок
  • *
  • Сообщений: 2
  • Благодарностей: 0
    • Сообщения от Darsel
Re: Помогите программисту
« Ответ #6 : 16 Окт 2009 [18:12:59] »
у меня таже проблема!
поиск видимых звезд в заданной точке в заданное время
пишу на Делфи
с формулами проблема, розъясните что к чему... пожалуйста!

Tau

  • Гость
Re: Помогите программисту
« Ответ #7 : 17 Окт 2009 [11:24:01] »
Дано: координаты наблюдателя – долгота Lon, широта Lat.
Момент наблюдения – год Year, месяц Mon, день Day, всемирное время UT в часах.
Ra, Dec - прямое восхождение и склонение звезды.
Найти: звезды, у которых в данный момент времени в данной точке высота над горизонтом  H >= 0.

1.Вычисление модифицированной  юлианской даты на начало суток MD.

 Если Mon <= 2    Mon = Mon + 12, Year = Year - 1
 Var1 = Year \ 400 - Year \ 100 + Year \ 4
 Var2 = 365 * Year - 679004
 MD = Var1 + Var2 + 306001 * (Mon + 1) \ 10000 + Day
\ - деление нацело

2. Вычисление местного звездного времени на момент всемирного времени UT

T0 = (MD - 51544.5) / 36525 ‘ мод.юл.дата на начало суток в юлианских столетиях
a1 = 24110.54841
a2 = 8640184.812
a3 = 0.093104
a4 = 0.0000062
S0 = a1 + a2 * T0 + a3 * T0 ^ 2 - a4 * T0 ^ 3 ' звездное время в Гринвиче на начало суток в секундах
Nsec =UT * 3600 ‘ количество секунд, прошедших  от начала суток до момента наблюдения
' UT - всемирное время в часах, момент расчета, UT = Ut[h] +Ut[min]/60 + Ut[sec]/3600
NsecS = Nsec * 366.2422 / 365.2422 ‘ количество звездных секунд, прошедших от начала суток
SG = (S0 + NsecS) /3600 * 15 ‘ гринвическое среднее звездное время в градусах
ST = SG + Lon ‘ местное звездное время, среднее
' Lon – долгота наблюдателя

3. Часовой угол звезды и высота над горизонтом

Если наблюдатель находится в северном полушарии (Lat>0), то звезды со склонением Dec<= 90-Lat являются невосходящими, следовательно для них высоту считать нужно, она будет < 0 всегда.
Если наблюдатель находится в южном полушарии (Lat<0), то звезды со склонением Dec>= 90+Lat являются невосходящими, следовательно для них высоту считать нужно, она будет < 0 всегда.
Если наблюдатель находится на экваторе, то вычислять высоту нужно для всех звезд.

ST – местное звездное время
Lat - широта
Th = ST - Ra  ‘ часовой угол
Cos (z)  = Sin(Lat) * Sin(Dec) + Cos(Lat) * Cos(Dec) * Cos(Th) ' косинус зенитного угла
H = 90 –z ‘ высота над горизонтом
Если H>=0, звезда над горизонтом

Пример:
Lon =  32,  Lat =  55
Year =  2009 , Mon =  10 , Day =  17, UT =  7
MD =  55121
ST =  162.915907736159
Пусть звезда имеет координаты:
RA =  279.316 , DEC =  38.797
Тогда
Th =  243.599907736159
H = 18.329728 ‘ звезда над горизонтом

Оффлайн Darsel

  • Новичок
  • *
  • Сообщений: 2
  • Благодарностей: 0
    • Сообщения от Darsel
Re: Помогите программисту
« Ответ #8 : 17 Окт 2009 [12:54:52] »
огромное спасибо!! ::)

Оффлайн ivxg

  • *****
  • Сообщений: 763
  • Благодарностей: 19
    • Сообщения от ivxg
Re: Помогите программисту
« Ответ #9 : 05 Янв 2016 [20:32:13] »
Немного подниму старую тему.

Аналогичная задача, найти высоту звезды над горизонтом.

Алгоритм пишу на PHP.

Вот его адаптация:

$Lon =  32;
$Lat =  55;
$Year =  2009;
$Mon =  10;
$Day =  17;
$RA =  279.316;
$DEC =  38.797;

if ($Mon <= 2)
 {
   $Mon = $Mon + 12;
   $Year = $Year - 1;
 }
 $Var1 = $Year / 400 - $Year / 100 + $Year / 4;
 $Var2 = (365 * $Year) - 679004;
 $MD = round($Var1 + $Var2 + 306001 * (($Mon + 1) / 10000) )+ $Day;
 
 echo "MD = $MD<Br>";
 
$to = ($MD - 51544.5) / 36525;
$a1 = 24110.54841;
$a2 = 8640184.812;
$a3 = 0.093104;
$a4 = 0.0000062;
$so = $a1 + ($a2 * $to) + ($a3 * pow($to, 2)) - ($a4 * pow($to, 3));

echo "so = $so<br>";

$Nsec = 3*3600;

echo "Nsec = $Nsec<br>";

$NsecS = $Nsec * 366.2422 / 365.2422;

echo "NsecS = $NsecS<br>";

$SG = ($so + $NsecS) /3600 * 15;

$ST = $SG + $Lon;

echo "ST = $ST<br>";

$Th = $ST - $RA;

echo"Th = $Th<br>";

$z  = acos((sin($Lat) * sin($DEC)) + (cos($Lat) * cos($DEC) * cos($Th)));

$H = 90 - $z;

echo"H = $H";

Разумеется он не рабочий. Начал проверку по строкам.

В итоге скрипт возвращает следующие значения:

MD = 55122
so = 870387.377912
Nsec = 10800
NsecS = 10829.56942
ST = 3703.73728055
Th = 3424.42128055
H = 87.353366962

Очевидно, что уже ST уже сильно не сходится с приведенным примером.

Прошу помочь, хотя бы начать со значения so...

Оффлайн Upsilon

  • *****
  • Сообщений: 518
  • Благодарностей: 245
    • Сообщения от Upsilon
Re: Помогите программисту
« Ответ #10 : 06 Янв 2016 [05:44:28] »
$MD = round($Var1 + $Var2 + 306001 * (($Mon + 1) / 10000) )+ $Day;
В этой строке у вас получается нецелое число, которое при округлении round() дает юлианскую дату на +1 больше нужной. Число должно быть целым без округления. Целочисленное деление не в том порядке, видимо, скобки надо переставить.
 
Звездное время в Гринвиче на полночь даты s0 правильное (на неправильную дату MD=55122). Время UT в примере 7h, а не 3h.

Тут многовато скобок и не хватает перевода градусов в радианы. Тригонометрические функции обычно требуют аргумент в радианах, а здесь все величины в градусах.
$z  = acos((sin($Lat) * sin($DEC)) + (cos($Lat) * cos($DEC) * cos($Th)));

Функция арккосинуса дает результат в радианах, то есть зенитный угол нужно перевести в градусы, а только потом делать это:
$H = 90 - $z;

Оффлайн ivxg

  • *****
  • Сообщений: 763
  • Благодарностей: 19
    • Сообщения от ivxg
Re: Помогите программисту
« Ответ #11 : 06 Янв 2016 [16:57:02] »
Цитата
$MD = round($Var1 + $Var2 + 306001 * (($Mon + 1) / 10000) )+ $Day;
В этой строке у вас получается нецелое число, которое при округлении round() дает юлианскую дату на +1 больше нужной. Число должно быть целым без округления. Целочисленное деление не в том порядке, видимо, скобки надо переставить.

Да, тут я временно отказался от целочисленного деления в каждом действии (как это рекомендует автор выше), ввиду того, что не успел подобрать соответствующую функцию. round() уж слишком сильно дает погрешность.

Цитата
Тут многовато скобок и не хватает перевода градусов в радианы. Тригонометрические функции обычно требуют аргумент в радианах, а здесь все величины в градусах.

Это я эпично тупанул - спасибо, совсем забыл математику.

Но вот с ST = 3703.73728055 - проблема. Даже если юлианская дата будет верной, то значение ST все равно чрезмерно большое. Вот в этом куске где-то есть ошибка:

$Nsec = 7*3600;

$NsecS = $Nsec * 366.2422 / 365.2422;

$SG = ($so + $NsecS) /3600 * 15;

$ST = $SG + $Lon;


Если, как Вы пишете, so - возвращает правильное значение (во всяком случае кол-во цифр относительно верно), то я даже не знаю к чему цепляться :(

Оффлайн ivxg

  • *****
  • Сообщений: 763
  • Благодарностей: 19
    • Сообщения от ivxg
Re: Помогите программисту
« Ответ #12 : 06 Янв 2016 [17:03:15] »
Ой!

После того как разобрался с радианами:

$z  = acos(sin(deg2rad($Lat)) * sin(deg2rad($DEC)) + cos(deg2rad($Lat)) * cos(deg2rad($DEC)) * cos(deg2rad($Th)));
$H = 90 - rad2deg($z);

Значение H само стало равно 18,32 как это в примере и указано.

Цитата
H = 18.329728 ‘ звезда над горизонтом

Видимо значение

Цитата
ST =  162.915907736159

указано у автора с ошибкой...

Оффлайн Upsilon

  • *****
  • Сообщений: 518
  • Благодарностей: 245
    • Сообщения от Upsilon
Re: Помогите программисту
« Ответ #13 : 06 Янв 2016 [19:21:10] »
Градусная мера циклична. Сколько ни прибавляйте-отнимайте 360 градусов (2*pi) - угол от этого не изменится. Звездное время и должно быть большим. Его надо привести в диапазон от 0 до 360 градусов для удобства восприятия, т.е. от угла отнять величину int(угол/360)*360.

Оффлайн ivxg

  • *****
  • Сообщений: 763
  • Благодарностей: 19
    • Сообщения от ivxg
Re: Помогите программисту
« Ответ #14 : 06 Янв 2016 [20:27:46] »
Да, Вы чертовски правы, если убрать лишние 10 полных кругов, то как раз искомые значения в появляются!

Спасибо!

Оффлайн ekvi

  • *****
  • Сообщений: 6 320
  • Благодарностей: 347
    • Сообщения от ekvi
Re: Помогите программисту
« Ответ #15 : 06 Янв 2016 [21:29:02] »
Если высота > 0 значит звезда видна.
больше 0 и меньше 180 градусов.