1 个稳定版本

使用旧的 Rust 2015

2.0.0 2016年5月22日
1.0.7 2016年3月22日
1.0.6 2016年2月28日
0.1.0 2016年2月26日
0.0.9 2016年2月5日

#72地理空间

Download history 201/week @ 2024-03-13 118/week @ 2024-03-20 133/week @ 2024-03-27 267/week @ 2024-04-03 259/week @ 2024-04-10 200/week @ 2024-04-17 121/week @ 2024-04-24 157/week @ 2024-05-01 107/week @ 2024-05-08 91/week @ 2024-05-15 157/week @ 2024-05-22 116/week @ 2024-05-29 85/week @ 2024-06-05 142/week @ 2024-06-12 133/week @ 2024-06-19 266/week @ 2024-06-26

649 每月下载量
用于 5 个 crate (4 个直接)

MIT 许可证

2.5MB
36K SLoC

astro-rust

内容

API 文档

关于

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 近似和行星日心定位,已实现了更精确的方法。

无运行时依赖