libnova是天文用的一個函式庫,像是計算RA DEC與方位仰角的互相轉換、儒略日(Julian Day)、天文曙光始、日月相關資訊、天體時角(hour angle)甚至是彗星軌道計算…等等天文基本運算。
請參考網頁 http://libnova.sourceforge.net/
這是一個標準的C函式庫,安裝完後header檔都會放在/usr/include/libnova,可以直接引用即可,或是可以自行單獨複製所需的header檔來用。 由於天文計算上的各種參數有些複雜,因此這個函式庫命名了不少相關的結構(structure),請參考說明書的 Data Structure。
下面以RA DEC與方位仰角的互相轉換來作為範例。
這個範例在網頁上就有,可以複製下來直接編譯,並執行看看:
=========================================================
#include <libnova/transform.h>
#include <libnova/julian_day.h>
#include <libnova/utility.h>
#include <stdio.h> /* 引入所需的 header*/
int main (int argc, char * argv[])
{
struct lnh_equ_posn hobject, hequ;
struct lnh_lnlat_posn hobserver;
struct ln_equ_posn object, equ;
struct ln_hrz_posn hrz;
struct lnh_hrz_posn hhrz;
struct ln_lnlat_posn observer; /* 這裡用各種結構宣告所需的變數們 */
struct ln_date date;
double JD;
/*設置觀測地點的經緯度,此為台北 */
hobserver.lng.degrees=121;hobserver.lng.minutes=30;hobserver.lng.seconds=00;
hobserver.lat.degrees = 25; hobserver.lat.minutes =03; hobserver.lat.seconds =00;
/* 設置天體的RA Dec */
hobject.ra.hours = 5; hobject.ra.minutes = 36;hobject.ra.seconds = 27;
hobject.dec.neg = 1; //Dec 的正負,0為正,非0為負
hobject.dec.degrees = 1; hobject.dec.minutes = 12;hobject.dec.seconds = 0;
/* UT date and time */
date.years = 2012; date.months = 1; date.days = 1;
date.hours = 20; date.minutes = 00; date.seconds = 00;
JD = ln_get_julian_day (&date); /* 先算儒略日*/
ln_hequ_to_equ (&hobject, &object); /*RADec換算成float的Degree單位*/
ln_hlnlat_to_lnlat (&hobserver, &observer); /*經緯度換算成float的Degree單位*/
ln_get_hrz_from_equ (&object, &observer, JD, &hrz); /*計算方位角與仰角*/
printf("(Alnilam) Equ to Horiz ALT %f\n", hrz.alt);
printf("(Alnilam) Equ to Horiz AZ %f\n", hrz.az);
ln_hrz_to_hhrz(&hrz, &hhrz); /*從Degree換算成 角度、角分、角秒 */
printf("ALT %d:%d:%f AZ %d:%d:%f\n", hhrz.alt.degrees, hhrz.alt.minutes,
hhrz.alt.seconds, hhrz.az.degrees, hhrz.az.minutes, hhrz.az.seconds);
/* 下面是反運算,再把仰角方位角轉回天體的RA Dec */
ln_get_equ_from_hrz (&hrz, &observer, JD, &equ);
ln_equ_to_hequ(&equ, &hequ);
printf("RA %d:%d:%f DEC %d:%d:%f\n", hequ.ra.hours, hequ.ra.minutes,
hequ.ra.seconds, hequ.dec.degrees, hequ.dec.minutes, hequ.dec.seconds);
=========================================================