Astrolog Представитель Astroworld.ru
Зарегистрирован: 02.08.2006 Сообщения: 1771
63.42 AW
|
Добавлено: Сб Мар 05, 2011 13:57 Заголовок сообщения: Swiss Ephemeris |
|
|
Работаю с этим решением. Знаю, что работаю не только я. А поэтому создаю тему, в которой буду писать о своих наработках, а также для того, чтобы делиться опытом с другими разработчиками, использующими этот модуль в своей работе. |
|
Astrolog Представитель Astroworld.ru
Зарегистрирован: 02.08.2006 Сообщения: 1771
63.42 AW
|
Добавлено: Сб Мар 05, 2011 14:17 Заголовок сообщения: Восход Солнца |
|
|
Вот практически сейчас искал, как с помощью Swiss Ephemeris рассчитать восход Солнца.
Функция из документации.
Код: | int32 swe_rise_trans(
double tjd_ut, /* search after this time (UT) */
int32 ipl, /* planet number, if planet or moon */
char *starname, /* star name, if star */
int32 epheflag, /* ephemeris flag */
int32 rsmi, /* integer specifying that rise, set, orone of the two meridian transits is
wanted. see definition below */
double *geopos, /* array of three doubles containing
* geograph. long., lat., height of observer */
double atpress, /* atmospheric pressure in mbar/hPa */
double attemp, /* atmospheric temperature in deg. C */
double *tret, /* return address (double) for rise time etc. */
char *serr); /* return address for error message */ |
tjd_ut находим из стандартной функции:
tjd_ut = swe_julday(), куда подставляем необходимые параметры (число, месяц, год).
следующий параметр - номер планеты. Нам нужно Солнце, это 0. Для Луны будет единица.
Далее идет переменная, обозначающее имя звезды. Это нужно для расчета звезд. Оставляем пустым, либо подставляем переменную (которую потом можно использовать, если надо считать восход звезды)
int32 epheflag - подставляем iflag (переменная описывается в самой стандартной программе-примере)
rsmi - ставим 0, так как нам нужен восход. Функция, к слову, позволяет считать не только восход.
geopos - тут я сделал так:
Код: | geopos(0) = lon
geopos(1) = lat
geopos(2) = 0 |
соотвтственно подставляется широта, долгота, и, видимо, высота.
Вызов самой функции с координатами у меня выглядит так (на VB):
Код: | retval = swe_rise_trans(tjd_ut, 0, starname$, iflag, 0, geopos(0), 100, 0, tret1, serr$) |
идем дальше, вводим давление (честно говоря не совсем понял в каких именно единицах нужно вводить), и температуру воздуха (в градусах Цельсия).
Задаем переменную tret1 типа double, в которой и будет нужное нам время и переменную, в которую будут писаться ошибки (строковой тип).
Эта функция возвращает юлианскую дату восхода.
Перевести время назад в Григорианский календарь можно следующей функцией:
Код: | swe_revjul(tret1, SE_GREG_CAL, god1, mes1, day1, hour1) |
god1 и т.п. это как раз значения в привычном календаре. Час возвращается в долях, а поэтому переводить дальше в минуты и секунды стоит самостоятельно.
P.S. Пока изучал тему восхода узнал много нового для себя, оказывается это зависит от различных факторов. Поэтому погрешность в таких вычислениях всегда есть, она может составлять плюс/минут несколько минут. |
|