use crate::config::parameters::*;
pub fn angular_separation(distance_from_observer: f64, physical_separation: f64) -> f64 {
(physical_separation / distance_from_observer).atan()
}
pub fn angular_separation_arcsec(distance_from_observer: f64, physical_separation: f64) -> f64 {
angular_separation(distance_from_observer, physical_separation) * 206265.0
}
pub fn occultation_duration(
satellite_radius: f64,
satellite_velocity: f64,
parent_radius: f64,
impact_parameter: f64,
) -> f64 {
let chord = 2.0
* ((parent_radius + satellite_radius).powi(2) - impact_parameter * impact_parameter)
.sqrt()
.max(0.0);
chord / (satellite_velocity + 1e-30)
}
pub fn mutual_event_probability(
satellite_radius_1: f64,
satellite_radius_2: f64,
orbital_distance: f64,
inclination: f64,
) -> f64 {
let h = orbital_distance * inclination.sin();
let target = satellite_radius_1 + satellite_radius_2;
if h < target { 1.0 } else { 0.0 }
}
pub fn astrometric_wobble(
satellite_mass: f64,
parent_mass: f64,
semi_major_axis: f64,
distance: f64,
) -> f64 {
let cm_offset = satellite_mass * semi_major_axis / (parent_mass + satellite_mass);
angular_separation_arcsec(distance, cm_offset)
}
pub fn parallax_distance(parallax_arcsec: f64) -> f64 {
AU / (parallax_arcsec * DEG / 3600.0).tan()
}
pub fn proper_motion(transverse_velocity: f64, distance: f64) -> f64 {
transverse_velocity / (distance + 1e-30) * 206265.0
}
pub fn light_travel_time(distance: f64) -> f64 {
distance / SPEED_OF_LIGHT
}