use crate::math::angle::*;
use crate::math::vector::vec_p;
use crate::math::vector::vec_p::VecP;
pub struct PhysPrm {
pub rad_mean: f64,
pub rad_equ: f64,
pub flatt_pol: f64,
pub mag_v10: f64,
}
impl PhysPrm {
pub fn vis_mag(&self, dist_sun_body: f64, dist_obs_body: f64) -> f64 {
self.mag_v10 + 5.0 * (dist_sun_body * dist_obs_body).log10()
}
pub fn vis_mean_rad(&self, dist_obs_body: f64) -> f64 {
(self.rad_mean / dist_obs_body).atan()
}
pub fn vis_equ_rad(&self, dist_obs_body: f64) -> f64 {
(self.rad_equ / dist_obs_body).atan()
}
pub fn vis_pol_rad(&self, vis_equ_rad: f64, lat_sop: f64) -> f64 {
let c = lat_sop.cos();
let c2 = c * c;
vis_equ_rad * (1.0 - self.flatt_pol * c2)
}
}
pub fn elongation(obs_sun: &VecP, obs_body: &VecP) -> f64 {
vec_p::sep_angl(&obs_sun, &obs_body)
}
pub fn phase_angl(body_sun: &VecP, body_obs: &VecP) -> f64 {
vec_p::sep_angl(&body_sun, &body_obs)
}
pub fn phase(phase_angl: f64) -> f64 {
(1.0 + phase_angl.cos()) / 2.0
}
pub fn surf_bright(vmag: f64, rad_equ: f64, rad_pol: f64, phase: f64) -> f64 {
vmag + 2.5 * (PI * rad_equ * rad_pol * phase).log10()
}