satellitesfactory 0.0.3

Satellite factory — classify, build and catalogue natural satellites for any planetary system: Solar System moons (Moon, Galileans, Titan, Triton…) or custom configurations.
Documentation
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
}