use crate::celestial_bodies::CelestialBody;
#[derive(Copy, Clone, Debug)]
pub struct BiellipticTransfer {
pub start_altitude: f64,
pub intermediate_altitude: f64,
pub end_altitude: f64,
pub celestial_body: CelestialBody,
}
impl BiellipticTransfer {
pub fn new(start_altitude: f64, intermediate_altitude: f64, end_altitude: f64, celestial_body: CelestialBody) -> Self {
Self {
start_altitude,
intermediate_altitude,
end_altitude,
celestial_body,
}
}
pub fn transfer_delta_v(&self) -> f64 {
let start_velocity = self.celestial_body.circular_velocity(self.start_altitude);
let transfer_velocity = self.celestial_body.velocity(self.start_altitude, (self.start_altitude + self.intermediate_altitude) * 0.5 + self.celestial_body.radius);
(start_velocity - transfer_velocity).abs()
}
pub fn periapsis_raise_delta_v(&self) -> f64 {
let intermediate_velocity = self.celestial_body.velocity(self.intermediate_altitude, (self.start_altitude + self.intermediate_altitude) * 0.5 + self.celestial_body.radius);
let transfer_velocity = self.celestial_body.velocity(self.intermediate_altitude, (self.end_altitude + self.intermediate_altitude) * 0.5 + self.celestial_body.radius);
(intermediate_velocity - transfer_velocity).abs()
}
pub fn circularization_delta_v(&self) -> f64 {
let transfer_velocity = self.celestial_body.velocity(self.end_altitude, (self.end_altitude + self.intermediate_altitude) * 0.5 + self.celestial_body.radius);
let end_velocity = self.celestial_body.circular_velocity(self.end_altitude);
(transfer_velocity - end_velocity).abs()
}
pub fn total_delta_v(&self) -> f64 {
self.transfer_delta_v() + self.periapsis_raise_delta_v() + self.circularization_delta_v()
}
}