use crate::constants::{ARCSEC_TO_RAD, CIRCULAR_ARCSECONDS, TWOPI};
use crate::math::fmod;
pub trait IERS2010FundamentalArgs {
fn mercury_lng(&self) -> f64;
fn venus_lng(&self) -> f64;
fn earth_lng(&self) -> f64;
fn mars_lng(&self) -> f64;
fn jupiter_lng(&self) -> f64;
fn saturn_lng(&self) -> f64;
fn uranus_lng(&self) -> f64;
fn precession(&self) -> f64;
fn moon_mean_anomaly(&self) -> f64;
fn mean_argument_of_latitude(&self) -> f64;
fn moon_ascending_node_longitude(&self) -> f64;
}
impl IERS2010FundamentalArgs for f64 {
#[inline]
fn mercury_lng(&self) -> f64 {
fmod(4.402608842 + 2608.7903141574 * self, TWOPI)
}
#[inline]
fn venus_lng(&self) -> f64 {
fmod(3.176146697 + 1021.3285546211 * self, TWOPI)
}
#[inline]
fn earth_lng(&self) -> f64 {
fmod(1.753470314 + 628.3075849991 * self, TWOPI)
}
#[inline]
fn mars_lng(&self) -> f64 {
fmod(6.203480913 + 334.0612426700 * self, TWOPI)
}
#[inline]
fn jupiter_lng(&self) -> f64 {
fmod(0.599546497 + 52.9690962641 * self, TWOPI)
}
#[inline]
fn saturn_lng(&self) -> f64 {
fmod(0.874016757 + 21.3299104960 * self, TWOPI)
}
#[inline]
fn uranus_lng(&self) -> f64 {
fmod(5.481293872 + 7.4781598567 * self, TWOPI)
}
#[inline]
fn precession(&self) -> f64 {
0.024381750 * self + 0.00000538691 * self * self
}
#[inline]
fn moon_mean_anomaly(&self) -> f64 {
let l = 485868.249036
+ self * (1717915923.2178 + self * (31.8792 + self * (0.051635 - self * 0.00024470)));
fmod(l, CIRCULAR_ARCSECONDS) * ARCSEC_TO_RAD
}
#[inline]
fn mean_argument_of_latitude(&self) -> f64 {
let f = 335779.526232
+ self * (1739527262.8478 + self * (-12.7512 + self * (-0.001037 + self * 0.00000417)));
fmod(f, CIRCULAR_ARCSECONDS) * ARCSEC_TO_RAD
}
#[inline]
fn moon_ascending_node_longitude(&self) -> f64 {
let om = 450160.398036
+ self * (-6962890.5431 + self * (7.4722 + self * (0.007702 - self * 0.00005939)));
fmod(om, CIRCULAR_ARCSECONDS) * ARCSEC_TO_RAD
}
}
pub trait MHB2000FundamentalArgs {
fn sun_mean_anomaly_mhb(&self) -> f64;
fn mean_elongation_mhb(&self) -> f64;
fn neptune_longitude_mhb(&self) -> f64;
}
impl MHB2000FundamentalArgs for f64 {
#[inline]
fn sun_mean_anomaly_mhb(&self) -> f64 {
let lp = 1287104.79305
+ self * (129596581.0481 + self * (-0.5532 + self * (0.000136 - self * 0.00001149)));
fmod(lp, CIRCULAR_ARCSECONDS) * ARCSEC_TO_RAD
}
#[inline]
fn mean_elongation_mhb(&self) -> f64 {
let d = 1072260.70369
+ self * (1602961601.2090 + self * (-6.3706 + self * (0.006593 - self * 0.00003169)));
fmod(d, CIRCULAR_ARCSECONDS) * ARCSEC_TO_RAD
}
#[inline]
fn neptune_longitude_mhb(&self) -> f64 {
fmod(5.321159000 + 3.8127774000 * self, TWOPI)
}
}