Точек более чем достаточно. Что касается точности, то думаю, даже первого варианта без возмущений хватит.
Всё уже придумано до нас)) А по делу, так есть
Швейцарские эфемериды. Подключаем готовую библиотеку (например, libswe.a)
Есть подробная
документация.Конечно, без знаний эфемеридной астрономии не обойтись, но процесс значительно ускорится.
Например, надо получить гелиоцентрические координаты Урана.
iflgret = swe_calc_ut(tjd_ut, p, iflag, x2, serr);
В результате работы этой функции, массиву x2 будут присвоены 6 значений:
x2[0] - Прямое восхождение
x2[1] - Склонение
x2[2] - Расстояние от Земли до объекта
x2[3] - Изменение прямого восхождения, гралусы/сутки
x2[4] - Изменение склонения, градусы/сутки
x2[5] - Изменение радиуса-вектора, астрономических единиц/сутки
tjd - Юлианская дата, время всемирное. Для эфемеридного времени используйте поправку.
p - планета
#define SE_SUN 0
#define SE_MOON 1
#define SE_MERCURY 2
#define SE_VENUS 3
#define SE_MARS 4
#define SE_JUPITER 5
#define SE_SATURN 6
#define SE_URANUS 7
#define SE_NEPTUNE 8
#define SE_PLUTO 9
iflag - самый интересный параметр. Позволяет указать какие координаты и в каком виде мы хотим получить, а также указать, что использовать для расчёта.
SEFLG_JPLEPH /* use JPL ephemeris */
SEFLG_SWIEPH /* use Swiss Ephemeris */
SEFLG_MOSEPH /* use Moshier ephemeris */
SEFLG_HELCTR 8L // return heliocentric position
SEFLG_TRUEPOS 16L // return true positions, not apparent
SEFLG_XYZ returns x, y, z coordinates instead of longitude, latitude, and distance.
Комбинируем, iflag = SEFLG_MOSEPH|SEFLG_HELCTR|SEFLG_TRUEPOS
Такая комбинация вернёт
геометрические (не учитывается аберрация, световая задержка и гравитационное искривление луча вблизи Солнца)
гелиоцентрические (в центре системы координат Солнце)
эклиптические (координаты в плоскости земной орбиты) координаты, отнесённые к равноденствию текущей даты (учтена прецессия и нутация). То есть вы видите, что эфемеридная матчасть не помешает)
Также здесь используются эфемериды Мошьера (на основе DE404, если не путаю). Профит в данном случае, что не нужно качать файлы с эфемеридами. Но хуже точность. Но она всё равно остаётся на очень приличном уровне. Отличие в долях секунд. Вам должно хватить её с головой.
По умолчанию суточные изменения координат НЕ вычисляются, если они вам нужны, то добавте к iflag ещё SEFLG_SPEED
Итого, для вычисления координат Урана, мы получим следующую функцию:
iflag = SEFLG_MOSEPH|SEFLG_HELCTR;
iflgret = swe_calc_ut(tjd_ut, SE_URANUS, iflag, x2, serr);
Если добавить SEFLG_XYZ, то получим прямоугольные координаты. Они удобны для получения негелицентрических координат. Например имеет гелиоцентрические координаты Меркурия и Земли (ABC и DEF соответственно. Для получения ГЕОцентрических координат Меркурия достаточно сложить гелиоцентрические координаты его и Земли.
9. Swiss Ephemeris Functions
9.1 Swiss Ephemeris APIWe give a short overview of the most important functions contained in the Swiss Ephemeris DLL. The detailed description of the programming interface is contained in the document swephprg.doc which is distributed together with the file you are reading.
Calculation of planets and stars
/* planets, moon, asteroids, lunar nodes, apogees, fictitious bodies */
swe_calc();/* fixed stars */
swe_fixstar(); Date and time conversion
/* delta t from Julian day number
* Ephemeris time (ET) = Universal time (UT) + swe_deltat(UT)*/
swe_deltat();/* Julian day number from year, month, day, hour, */
swe_date_conversion (); /* Julian day number from year, month, day, hour */
swe_julday(); /* year, month, day, hour from Julian day number */
swe_revjul ();/* UTC to Julian day number */
swe_utc_to_jd ();/* Julian day number TT to UTC */
swe_jdet_to_utc ();/* Julian day number UT1 to UTC */
swe_jdut1_to_utc ();/* utc to time zone or time zone to utc*/
swe_utc_time_zone ();/* get tidal acceleration used in swe_deltat() */
swe_get_tid_acc();/* set tidal acceleration to be used in swe_deltat() */
swe_set_tid_acc();Initialization, setup, and closing functions
/* set directory path of ephemeris files */
swe_set_ephe_path();/* set name of JPL ephemeris file */
swe_set_jpl_file();/* close Swiss Ephemeris */
swe_close();