#[derive(Debug, Clone, Copy)]
pub struct Ellipsoid {
pub a: f64,
pub inv_f: f64,
}
impl Ellipsoid {
pub fn b(&self) -> f64 {
self.a * (1.0 - 1.0 / self.inv_f)
}
pub fn e2(&self) -> f64 {
let f = 1.0 / self.inv_f;
2.0 * f - f * f
}
pub fn n(&self) -> f64 {
let f = 1.0 / self.inv_f;
f / (2.0 - f)
}
}
pub const WGS84: Ellipsoid = Ellipsoid {
a: 6_378_137.0,
inv_f: 298.257_223_563,
};
pub const GRS80: Ellipsoid = Ellipsoid {
a: 6_378_137.0,
inv_f: 298.257_222_101,
};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn wgs84_constants_within_tolerance() {
assert!((WGS84.e2() - 0.006_694_379_990_141_3).abs() < 1e-15);
assert!((WGS84.n() - 0.001_679_220_386_383_5).abs() < 1e-12);
}
#[test]
fn grs80_and_wgs84_essentially_identical() {
assert!((WGS84.e2() - GRS80.e2()).abs() < 1e-10);
assert_eq!(WGS84.a, GRS80.a);
}
}