1 个稳定版本
使用旧的 Rust 2015
2.0.0 | 2016年5月22日 |
---|---|
1.0.7 |
|
1.0.6 |
|
0.1.0 |
|
0.0.9 |
|
#72 在 地理空间
649 每月下载量
用于 5 个 crate (4 个直接)
2.5MB
36K SLoC
astro-rust
内容
关于
astro-rust
是 Rust 编程语言的 天文算法 库。
实现的算法包括
- 根据 Bretagnon 和 Francou 的 VSP087 理论完整元素集进行行星和太阳定位
- 根据 Chapront 的 ELP-2000/82 理论原理元素进行月球定位
- 土星和木星的卫星定位
- 寻找儒略日、恒星时、动力学时、春分、升落时间、月相时间
- 坐标变换
- 对进动、章动、视差、偏振、大气折射进行校正
- 计算火星、木星和土星环的物理星历
- 寻找位置角、照度分数、视星等
- 还有更多内容。
用法
-
在您的
Cargo.toml
中添加依赖项astro
[dependencies] astro = "1.0.7"
-
在您的代码中包含 crate
astro
extern crate astro; use astro::*;
-
使用 儒略日 指定您感兴趣的时间
// for example, the time of the Apollo 11 moon landing let day_of_month = time::DayOfMonth{day : 20, hr : 20, min : 18, sec : 4.0, time_zone: 0.0}; let date = time::Date{year : 1969, month : 7, // July decimal_day: time::decimal_day(&day_of_month), cal_type : time::CalType::Gregorian}; let julian_day = time::julian_day(&date); // for higher accuracy in specifying the time of interest, // find the Julian Ephemeris day; this slightly differs from // the Julian day by ΔT, which is usually a few seconds. you // can get a reported value of it from the Astronomical // Almanac, or calculate it using the built-in function let delta_t = time::approx_delta_t(date.year, date.month); // a good one, actually let julian_ephm_day = time::julian_emph_day(julian_day, delta_t);
-
找到太阳和月亮相对于地球的位置
// geocentric ecliptic point and radius vector of the Sun let (sun_ecl_point, rad_vec_sun) = sun::geocen_ecl_pos(julian_day); // sun_ecl_point.long - ecliptic longitude (radians) // sun_ecl_point.lat - ecliptic latitude (radians) // rad_vec_sun - distance between the Sun and the Earth (AU) // and similarly for the Moon let (moon_ecl_point, rad_vec_moon) = lunar::geocen_ecl_pos(julian_day);
-
找到行星相对于太阳的位置
// the heliocentric point and radius vector of a planet, like Jupiter let (jup_long, jup_lat, rad_vec) = planet::heliocen_pos(&planet::Planet::Jupiter, julian_day); // or neptune let (nep_long, nep_lat, rad_vec) = planet::heliocen_pos(&planet::Planet::Neptune, julian_day); // positioning for all the eight planets (and (the dwarf planet) Pluto) is supported let (plut_long, plut_lat, rad_vec) = pluto::heliocen_pos(julian_day);
-
找到地球上两点之间的测地距离
// geodesic distance between the Observatoire de Paris and // the US Naval Observatory at Washington DC let paris = coords::GeographPoint{long: angle::deg_frm_dms(-2, 20, 14.0).to_radians(), lat : angle::deg_frm_dms(48, 50, 11.0).to_radians()}; let washington = coords::GeographPoint{long: angle::deg_frm_dms(77, 3, 56.0).to_radians(), lat : angle::deg_frm_dms(38, 55, 17.0).to_radians()}; // angle::deg_frm_dms() converts degrees expressed in degrees, // minutes and seconds into a fractional degree let distance = planet::earth::geodesic_dist(&paris, &washington); // in meters
-
将赤道坐标转换为黄道坐标
// equatorial coordinates of the star Pollux let right_ascension = 116.328942_f64.to_radians(); let declination = 28.026183_f64.to_radians(); // mean obliquity of the ecliptic let oblq_eclip = 23.4392911_f64.to_radians(); // you can also get oblq_eclip from ecliptic::mn_oblq_IAU(julian_day) // for the Julian day on which the coordinates of the star // were observed // also make sure to type #[macro_use] before including the crate // to use macros // now, convert equatorial coordinates to ecliptic coordinates let (ecl_long, ecl_lat) = ecl_frm_eq!(right_ascension, declination, oblq_eclip);
-
将赤道坐标转换为银河坐标
// equatorial coordinates of the Nova Serpentis 1978 let right_ascension = angle::deg_frm_hms(17, 48, 59.74).to_radians(); let declination = angle::deg_frm_dms(-14, 43, 8.2).to_radians(); // convert to galactic coordinates let (gal_long, gal_lat) = gal_frm_eq!(right_ascension, declination);
-
校正不同坐标系中的章动
// nutation in ecliptic longitude and obliquity of the ecliptic let (nut_in_long, nut_in_oblq) = nutation::nutation(julian_day); // nutation in equatorial coordinates let (nut_in_asc, nut_in_dec) = nutation::nutation_in_eq_coords(julian_day);
贡献
鼓励任何有兴趣以任何可能的方式做出贡献的人这样做。Meeus 的书中并非所有算法都已实现。还需要为它们编写文档和测试。欢迎重构现有代码和进行微优化。
本项目最终目标是构建一个现代、经过充分测试和良好文档记录的算法库,供未来在天文学中使用。Rust 是构建该库的最佳选择。
一个有趣的建议是添加最新的IAU 2000/2006 预章动模型。这种方法通过考虑地幔粘弹性、海洋潮汐、流体外核与地幔以及固体内核与流体外核之间产生的电磁耦合效应来改进现有模型。
参考资料
用作算法源的主要参考是著名的书籍《天文学算法》(Jean Meeus 著),本书的几乎每一章在这里都得到了处理,包括具有良好文档记录的函数和使用本书示例数据的测试;在某些情况下,例如 ΔT 近似和行星日心定位,已实现了更精确的方法。
- 大多数算法:天文学算法,第二版(Meeus)
- 行星日心定位:VSOP87-D
- 近似 ΔT:五千年日食汇编(Espenak 和 Meeus)
- 一些物理常数:1984年世界大地测量系统