Skip to main content

geo_coding/
distance.rs

1#[cfg(feature = "std")]
2mod earth;
3
4#[cfg(feature = "std")]
5pub use self::earth::*;
6
7/// Returns maximum distance between two points computed along each axis individually,
8/// i.e. $ \mathrm{max}\left(\left|x_1 - x_0\right|, \left|y_1 - y_0\right|\right) $.
9pub 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
15/// Returns squared Euclidean distance between two points.
16pub 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}