use affn::cartesian::Direction;
use affn::frames::ReferenceFrame;
use qtty::angular::Radians;
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct LocalFrame {
pub lat: Radians,
pub lon: Radians,
}
impl LocalFrame {
pub const fn new(lat: Radians, lon: Radians) -> Self {
Self { lat, lon }
}
pub(in crate::mission::geometry) fn basis<F: ReferenceFrame>(
&self,
) -> (Direction<F>, Direction<F>, Direction<F>) {
let (sp, cp) = self.lat.sin_cos();
let (sl, cl) = self.lon.sin_cos();
let east = Direction::new_unchecked(-sl, cl, 0.0);
let north = Direction::new_unchecked(-sp * cl, -sp * sl, cp);
let up = Direction::new_unchecked(cp * cl, cp * sl, sp);
(east, north, up)
}
}