spaceman 0.1.0

A WIP library for calculating common orbital maneuvers in Kerbal Space Program.
Documentation
use crate::celestial_bodies::CelestialBody;

/// A Hohmann transfer between two different altitudes.
#[derive(Copy, Clone, Debug)]
pub struct HohmannTransfer {
    /// The current altitude of the spacecraft.
    pub start_altitude: f64,
    /// The target altitude of the spacecraft.
    pub end_altitude: f64,
    /// The celestial body the spacecraft is orbiting.
    pub celestial_body: CelestialBody,
}

impl HohmannTransfer {
    /// Create a new Hohmann transfer.
    pub fn new(start_altitude: f64, end_altitude: f64, celestial_body: CelestialBody) -> Self {
        Self {
            start_altitude,
            end_altitude,
            celestial_body,
        }
    }

    /// Calculate the Δv needed for the transfer orbit.
    pub fn transfer_delta_v(&self) -> f64 {
        let start_velocity = self.celestial_body.circular_velocity(self.start_altitude);
        let start_transfer_velocity = self.celestial_body.velocity(
            self.start_altitude,
            self.celestial_body.radius + (self.start_altitude + self.end_altitude) * 0.5,
        );

        (start_velocity - start_transfer_velocity).abs()
    }

    /// Calculate the Δv needed for circularizing at the end altitude.
    pub fn circularization_delta_v(&self) -> f64 {
        let end_transfer_velocity = self.celestial_body.velocity(
            self.end_altitude,
            self.celestial_body.radius + (self.start_altitude + self.end_altitude) * 0.5,
        );
        let end_velocity = self.celestial_body.circular_velocity(self.end_altitude);

        (end_transfer_velocity - end_velocity).abs()
    }

    /// Calculate the total amount of Δv needed to perform the Hohmann transfer.
    pub fn total_delta_v(&self) -> f64 {
        self.transfer_delta_v() + self.circularization_delta_v()
    }
}