use crate::celestial_bodies::CelestialBody;
#[derive(Copy, Clone, Debug)]
pub struct HohmannTransfer {
pub start_altitude: f64,
pub end_altitude: f64,
pub celestial_body: CelestialBody,
}
impl HohmannTransfer {
pub fn new(start_altitude: f64, end_altitude: f64, celestial_body: CelestialBody) -> Self {
Self {
start_altitude,
end_altitude,
celestial_body,
}
}
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()
}
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()
}
pub fn total_delta_v(&self) -> f64 {
self.transfer_delta_v() + self.circularization_delta_v()
}
}