use crate::datetime::mjd::DJCENT;
use crate::datetime::mjd::J2000;
use crate::math::angle::DBLPI;
use crate::math::angle::DEGRAD;
use crate::math::angle::HLFPI;
use crate::math::matrix::mat_r;
use crate::math::matrix::mat_r::MatR;
use crate::math::sphe::sph;
use crate::math::sphe::sph::Sph;
use crate::math::vector::vec_p;
use crate::math::vector::vec_p::VecP;
pub struct PlnGrph {
pub rap: f64,
pub dep: f64,
pub w0: f64,
pub wt: f64,
}
impl PlnGrph {
pub fn rot_period(&self) -> f64 {
DBLPI / self.wt.abs()
}
pub fn sub_obs(&self, obs_body: &VecP, gcrs_true: &MatR) -> (f64, f64, f64) {
let mut sphe_pol = Sph {
lon: self.rap,
lat: self.dep,
};
let mut p_pol = sphe_pol.to_cart();
p_pol = mat_r::mul_p(&gcrs_true, &p_pol);
sphe_pol = sph::from_cart(&p_pol);
let body_obs = vec_p::scale(-1.0, &obs_body);
let to_plncent = mat_r::mul(
&mat_r::rot_z(self.w0),
&mat_r::mul(
&mat_r::rot_x(HLFPI - sphe_pol.lat),
&mat_r::rot_z(sphe_pol.lon + HLFPI),
),
);
let p_sub_obs = mat_r::mul_p(&to_plncent, &body_obs);
let sphe_sub_obs = sph::from_cart(&p_sub_obs);
(
sphe_sub_obs.lon,
sphe_sub_obs.lat,
vec_p::pos_angl(&obs_body, &p_pol),
)
}
}
pub fn plngr_lat(flatt_pol: f64, plncen_lat: f64) -> f64 {
let f = 1.0 - flatt_pol;
let f2 = f * f;
(plncen_lat.tan() / f2).atan()
}
pub fn d_pol(vis_pol_rad: f64, lat_sop: f64) -> f64 {
if lat_sop > 0.0 {
vis_pol_rad * lat_sop.cos()
} else {
-vis_pol_rad * lat_sop.cos()
}
}
pub fn sun(mjd_tt: f64) -> PlnGrph {
let dt = mjd_tt - J2000;
PlnGrph {
rap: 286.13 * DEGRAD,
dep: 63.87 * DEGRAD,
w0: (84.176 + 14.1844000 * dt) % 360.0 * DEGRAD,
wt: 14.1844000 * DEGRAD,
}
}
pub fn mercury(mjd_tt: f64) -> PlnGrph {
let dt = mjd_tt - J2000;
let dtc = dt / DJCENT;
let m1 = (174.7910857 + 4.092335 * dt) * DEGRAD;
let m2 = (349.5821714 + 8.184670 * dt) * DEGRAD;
let m3 = (164.3732571 + 12.277005 * dt) * DEGRAD;
let m4 = (339.1643429 + 16.369340 * dt) * DEGRAD;
let m5 = (153.9554286 + 20.461675 * dt) * DEGRAD;
PlnGrph {
rap: (281.0103 - 0.0328 * dtc) * DEGRAD,
dep: (61.4155 - 0.0049 * dtc) * DEGRAD,
w0: ((329.5988 + 6.1385108 * dt) % 360.0 + 0.01067257 * m1.sin()
- 0.00112309 * m2.sin()
- 0.00011040 * m3.sin()
- 0.00002539 * m4.sin()
- 0.00000571 * m5.sin())
* DEGRAD,
wt: 6.1385108 * DEGRAD,
}
}
pub fn venus(mjd_tt: f64) -> PlnGrph {
let dt = mjd_tt - J2000;
PlnGrph {
rap: 272.76 * DEGRAD,
dep: 67.16 * DEGRAD,
w0: (160.20 - 1.4813688 * dt) % 360.0 * DEGRAD,
wt: -1.4813688 * DEGRAD,
}
}
pub fn earth(mjd_tt: f64) -> PlnGrph {
let dt = mjd_tt - J2000;
let dtc = dt / DJCENT;
PlnGrph {
rap: (0.00 - 0.641 * dtc) * DEGRAD,
dep: (90.00 - 0.557 * dtc) * DEGRAD,
w0: (190.147 + 360.9856235 * dt) % 360.0 * DEGRAD,
wt: 360.9856235 * DEGRAD,
}
}
pub fn mars(mjd_tt: f64) -> PlnGrph {
let dt = mjd_tt - J2000;
let dtc = dt / DJCENT;
PlnGrph {
rap: (317.269202 - 0.10927547 * dtc
+ 0.000068 * ((198.991226 + 19139.4819985 * dtc) * DEGRAD).sin()
+ 0.000238 * ((226.292679 + 38280.8511281 * dtc) * DEGRAD).sin()
+ 0.000052 * ((249.663391 + 57420.7251593 * dtc) * DEGRAD).sin()
+ 0.000009 * ((266.183510 + 76560.6367950 * dtc) * DEGRAD).sin()
+ 0.419057 * ((79.398797 + 0.5042615 * dtc) * DEGRAD).sin())
* DEGRAD,
dep: (54.432516 - 0.05827105 * dtc
+ 0.000051 * ((122.433576 + 19139.9407476 * dtc) * DEGRAD).cos()
+ 0.000141 * ((43.058401 + 38280.8753272 * dtc) * DEGRAD).cos()
+ 0.000031 * ((57.663379 + 57420.7517205 * dtc) * DEGRAD).cos()
+ 0.000005 * ((79.476401 + 76560.6495004 * dtc) * DEGRAD).cos()
+ 1.591274 * ((166.325722 + 0.5042615 * dtc) * DEGRAD).cos())
* DEGRAD,
w0: ((176.049863 + 350.891982443297 * dt) % 360.0
+ 0.000145 * ((129.071773 + 19140.0328244 * dtc) * DEGRAD).sin()
+ 0.000157 * ((36.352167 + 38281.0473591 * dtc) * DEGRAD).sin()
+ 0.000040 * ((56.668646 + 57420.9295360 * dtc) * DEGRAD).sin()
+ 0.000001 * ((67.364003 + 76560.2552215 * dtc) * DEGRAD).sin()
+ 0.000001 * ((104.792680 + 95700.4387578 * dtc) * DEGRAD).sin()
+ 0.584542 * ((95.391654 + 0.5042615 * dtc) * DEGRAD).sin())
* DEGRAD,
wt: 350.891982443297 * DEGRAD,
}
}
pub fn jupiter_i(mjd_tt: f64) -> PlnGrph {
let dt = mjd_tt - J2000;
let dtc = dt / DJCENT;
let (jas, jac) = ((99.360714 + 4850.4046 * dtc) * DEGRAD).sin_cos();
let (jbs, jbc) = ((175.895369 + 1191.9605 * dtc) * DEGRAD).sin_cos();
let (jcs, jcc) = ((300.323162 + 262.5475 * dtc) * DEGRAD).sin_cos();
let (jds, jdc) = ((114.012305 + 6070.2476 * dtc) * DEGRAD).sin_cos();
let (jes, jec) = ((49.511251 + 64.3000 * dtc) * DEGRAD).sin_cos();
PlnGrph {
rap: (268.056595 - 0.006499 * dtc
+ 0.000117 * jas
+ 0.000938 * jbs
+ 0.001432 * jcs
+ 0.000030 * jds
+ 0.002150 * jes)
* DEGRAD,
dep: (64.495303 + 0.002413 * dtc + 0.000050 * jac + 0.000404 * jbc + 0.000617 * jcc
- 0.000013 * jdc
+ 0.000926 * jec)
* DEGRAD,
w0: (67.1 + 877.900 * dt) % 360.0 * DEGRAD,
wt: 877.900 * DEGRAD,
}
}
pub fn jupiter_ii(mjd_tt: f64) -> PlnGrph {
let dt = mjd_tt - J2000;
let dtc = dt / DJCENT;
let (jas, jac) = ((99.360714 + 4850.4046 * dtc) * DEGRAD).sin_cos();
let (jbs, jbc) = ((175.895369 + 1191.9605 * dtc) * DEGRAD).sin_cos();
let (jcs, jcc) = ((300.323162 + 262.5475 * dtc) * DEGRAD).sin_cos();
let (jds, jdc) = ((114.012305 + 6070.2476 * dtc) * DEGRAD).sin_cos();
let (jes, jec) = ((49.511251 + 64.3000 * dtc) * DEGRAD).sin_cos();
PlnGrph {
rap: (268.056595 - 0.006499 * dtc
+ 0.000117 * jas
+ 0.000938 * jbs
+ 0.001432 * jcs
+ 0.000030 * jds
+ 0.002150 * jes)
* DEGRAD,
dep: (64.495303 + 0.002413 * dtc + 0.000050 * jac + 0.000404 * jbc + 0.000617 * jcc
- 0.000013 * jdc
+ 0.000926 * jec)
* DEGRAD,
w0: (43.3 + 870.270 * dt) % 360.0 * DEGRAD,
wt: 870.270 * DEGRAD,
}
}
pub fn jupiter_iii(mjd_tt: f64) -> PlnGrph {
let dt = mjd_tt - J2000;
let dtc = dt / DJCENT;
let (jas, jac) = ((99.360714 + 4850.4046 * dtc) * DEGRAD).sin_cos();
let (jbs, jbc) = ((175.895369 + 1191.9605 * dtc) * DEGRAD).sin_cos();
let (jcs, jcc) = ((300.323162 + 262.5475 * dtc) * DEGRAD).sin_cos();
let (jds, jdc) = ((114.012305 + 6070.2476 * dtc) * DEGRAD).sin_cos();
let (jes, jec) = ((49.511251 + 64.3000 * dtc) * DEGRAD).sin_cos();
PlnGrph {
rap: (268.056595 - 0.006499 * dtc
+ 0.000117 * jas
+ 0.000938 * jbs
+ 0.001432 * jcs
+ 0.000030 * jds
+ 0.002150 * jes)
* DEGRAD,
dep: (64.495303 + 0.002413 * dtc + 0.000050 * jac + 0.000404 * jbc + 0.000617 * jcc
- 0.000013 * jdc
+ 0.000926 * jec)
* DEGRAD,
w0: (284.95 + 870.5360000 * dt) % 360.0 * DEGRAD,
wt: 870.5360000 * DEGRAD,
}
}
pub fn saturn(mjd_tt: f64) -> PlnGrph {
let dt = mjd_tt - J2000;
let dtc = dt / DJCENT;
PlnGrph {
rap: (40.589 - 0.036 * dtc) * DEGRAD,
dep: (83.537 - 0.004 * dtc) * DEGRAD,
w0: (38.90 + 810.7939024 * dt) % 360.0 * DEGRAD,
wt: 810.7939024 * DEGRAD,
}
}
pub fn uranus(mjd_tt: f64) -> PlnGrph {
let dt = mjd_tt - J2000;
PlnGrph {
rap: 257.311 * DEGRAD,
dep: -15.175 * DEGRAD,
w0: (203.81 - 501.1600928 * dt) % 360.0 * DEGRAD,
wt: -501.1600928 * DEGRAD,
}
}
pub fn neptune(mjd_tt: f64) -> PlnGrph {
let dt = mjd_tt - J2000;
let dtc = dt / DJCENT;
let (ns, nc) = ((357.85 + 52.316 * dtc) * DEGRAD).sin_cos();
PlnGrph {
rap: (299.36 + 0.70 * ns) * DEGRAD,
dep: (43.46 - 0.51 * nc) * DEGRAD,
w0: ((249.978 + 541.1397757 * dt) % 360.0 - 0.48 * ns) * DEGRAD,
wt: 541.1397757 * DEGRAD,
}
}
pub fn moon(mjd_tt: f64) -> PlnGrph {
let dt = mjd_tt - J2000;
let dtc = dt / DJCENT;
let (e1s, e1c) = ((125.045 - 0.0529921 * dt) * DEGRAD).sin_cos();
let (e2s, e2c) = ((250.089 - 0.1059842 * dt) * DEGRAD).sin_cos();
let (e3s, e3c) = ((260.008 + 13.0120009 * dt) * DEGRAD).sin_cos();
let (e4s, e4c) = ((176.625 + 13.3407154 * dt) * DEGRAD).sin_cos();
let e5s = ((357.529 + 0.9856003 * dt) * DEGRAD).sin();
let (e6s, e6c) = ((311.589 + 26.4057084 * dt) * DEGRAD).sin_cos();
let (e7s, e7c) = ((134.963 + 13.0649930 * dt) * DEGRAD).sin_cos();
let e8s = ((276.617 + 0.3287146 * dt) * DEGRAD).sin();
let e9s = ((34.226 + 1.7484877 * dt) * DEGRAD).sin();
let (e10s, e10c) = ((15.134 - 0.1589763 * dt) * DEGRAD).sin_cos();
let e11s = ((119.743 + 0.0036096 * dt) * DEGRAD).sin();
let e12s = ((239.961 + 0.1643573 * dt) * DEGRAD).sin();
let (e13s, e13c) = ((25.053 + 12.9590088 * dt) * DEGRAD).sin_cos();
PlnGrph {
rap: (269.9949 + 0.0031 * dtc - 3.8787 * e1s - 0.1204 * e2s + 0.0700 * e3s - 0.0172 * e4s
+ 0.0072 * e6s
- 0.0052 * e10s
+ 0.0043 * e13s)
* DEGRAD,
dep: (66.5392 + 0.0130 * dtc + 1.5419 * e1c + 0.0239 * e2c - 0.0278 * e3c + 0.0068 * e4c
- 0.0029 * e6c
+ 0.0009 * e7c
+ 0.0008 * e10c
- 0.0009 * e13c)
* DEGRAD,
w0: ((38.3213 + 13.17635815 * dt) % 360.0 - 1.4e-12 * dt * dt
+ 3.5610 * e1s
+ 0.1208 * e2s
- 0.0642 * e3s
+ 0.0158 * e4s
+ 0.0252 * e5s
- 0.0066 * e6s
- 0.0047 * e7s
- 0.0046 * e8s
+ 0.0028 * e9s
+ 0.0052 * e10s
+ 0.0040 * e11s
+ 0.0019 * e12s
- 0.0044 * e13s)
* DEGRAD,
wt: 13.17635815 * DEGRAD,
}
}