1#[cfg(feature = "std")]
2mod earth;
3
4#[cfg(feature = "std")]
5pub use self::earth::*;
6
7pub fn orthogonal_distance(a: &[i64; 2], b: &[i64; 2]) -> u64 {
10 let dx = a[0].abs_diff(b[0]);
11 let dy = a[1].abs_diff(b[1]);
12 dx.max(dy)
13}
14
15pub fn euclidean_distance_squared(a: &[i64; 2], b: &[i64; 2]) -> u64 {
17 let dx_squared = distance_squared_scalar(a[0], b[0]);
18 let dy_squared = distance_squared_scalar(a[1], b[1]);
19 dx_squared.saturating_add(dy_squared)
20}
21
22fn distance_squared_scalar(a: i64, b: i64) -> u64 {
23 let dx = a.abs_diff(b);
24 dx.saturating_mul(dx)
25}
26
27#[cfg(test)]
28mod tests {
29 use super::*;
30
31 #[test]
32 fn earth_distance_works() {
33 let d = earth_distance_f64(&[-77.0366, 38.8976], &[-75.1503, 39.9496]);
34 assert!((d - 200_000.0).abs() < 1000.0, "d = {d}");
35 }
36}