mod gooding;
pub use gooding::gooding_lambert;
pub use gooding::lambert;
pub use gooding::MultiRevPeriod;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Direction {
Prograde,
Retrograde,
}
#[derive(Debug, Clone, PartialEq)]
pub struct LambertSolution {
pub v1: [f64; 3],
pub v2: [f64; 3],
}
#[derive(Debug, Clone, PartialEq)]
pub enum LambertError {
SingularTransfer,
NoSolution,
ConvergenceFailed,
InvalidInput(&'static str),
}
impl std::fmt::Display for LambertError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
LambertError::SingularTransfer => {
write!(f, "transfer angle is exactly 180°; transfer plane is undefined")
}
LambertError::NoSolution => {
write!(
f,
"no solution exists for the given revolution count and time of flight"
)
}
LambertError::ConvergenceFailed => {
write!(
f,
"Householder iteration failed to converge within the iteration limit"
)
}
LambertError::InvalidInput(reason) => {
write!(f, "invalid input: {reason}")
}
}
}
}
impl std::error::Error for LambertError {}