pub mod haversine;
pub mod point_to_segment;
pub mod vincenty;
pub use haversine::{
bearing, destination, haversine, haversine_km, haversine_miles, haversine_nautical,
};
pub use point_to_segment::{great_circle_point_to_seg, point_to_segment_enu_m};
pub use vincenty::{vincenty_distance_m, VincentyError};
const F: f64 = 1.0 / 298.257_223_563;
pub(crate) fn compute_reduced_latitudes_and_trig(
lat1_rad: f64,
lat2_rad: f64,
) -> (f64, f64, f64, f64, f64, f64) {
let u1 = ((1.0 - F) * lat1_rad.tan()).atan();
let u2 = ((1.0 - F) * lat2_rad.tan()).atan();
let sin_u1 = u1.sin();
let cos_u1 = u1.cos();
let sin_u2 = u2.sin();
let cos_u2 = u2.cos();
(u1, u2, sin_u1, cos_u1, sin_u2, cos_u2)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_compute_reduced_latitudes_and_trig() {
let lat1_rad = 0.6588; let lat2_rad = 0.7084;
let (u1, u2, sin_u1, cos_u1, sin_u2, cos_u2) =
compute_reduced_latitudes_and_trig(lat1_rad, lat2_rad);
let expected_u1 = ((1.0 - F) * lat1_rad.tan()).atan();
let expected_u2 = ((1.0 - F) * lat2_rad.tan()).atan();
assert!((u1 - expected_u1).abs() < 1e-15);
assert!((u2 - expected_u2).abs() < 1e-15);
assert!((sin_u1 - u1.sin()).abs() < 1e-15);
assert!((cos_u1 - u1.cos()).abs() < 1e-15);
assert!((sin_u2 - u2.sin()).abs() < 1e-15);
assert!((cos_u2 - u2.cos()).abs() < 1e-15);
assert!((sin_u1 * sin_u1 + cos_u1 * cos_u1 - 1.0).abs() < 1e-15);
assert!((sin_u2 * sin_u2 + cos_u2 * cos_u2 - 1.0).abs() < 1e-15);
}
#[test]
fn test_compute_reduced_latitudes_equatorial() {
let (u1, u2, sin_u1, cos_u1, sin_u2, cos_u2) = compute_reduced_latitudes_and_trig(0.0, 0.0);
assert!(u1.abs() < 1e-15);
assert!(u2.abs() < 1e-15);
assert!(sin_u1.abs() < 1e-15);
assert!(sin_u2.abs() < 1e-15);
assert!((cos_u1 - 1.0).abs() < 1e-15);
assert!((cos_u2 - 1.0).abs() < 1e-15);
}
#[test]
fn test_compute_reduced_latitudes_polar() {
let lat_polar = std::f64::consts::PI / 2.0 - 1e-8; let (u1, _u2, sin_u1, cos_u1, _sin_u2, _cos_u2) =
compute_reduced_latitudes_and_trig(lat_polar, 0.0);
assert!(u1 < std::f64::consts::PI / 2.0);
assert!(u1 > std::f64::consts::PI / 2.0 - 0.01);
assert!(sin_u1 > 0.99);
assert!(cos_u1 > 0.0 && cos_u1 < 0.1);
}
}