-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
/
Copy pathbearing.rs
40 lines (32 loc) · 884 Bytes
/
bearing.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use std::f64::consts::PI;
pub fn bearing(lat1: f64, lng1: f64, lat2: f64, lng2: f64) -> f64 {
let lat1 = lat1 * PI / 180.0;
let lng1 = lng1 * PI / 180.0;
let lat2 = lat2 * PI / 180.0;
let lng2 = lng2 * PI / 180.0;
let delta_longitude = lng2 - lng1;
let y = delta_longitude.sin() * lat2.cos();
let x = lat1.cos() * lat2.sin() - lat1.sin() * lat2.cos() * delta_longitude.cos();
let mut brng = y.atan2(x);
brng = brng.to_degrees();
(brng + 360.0) % 360.0
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn testing() {
assert_eq!(
format!(
"{:.0}º",
bearing(
-27.2020447088982,
-49.631891179172555,
-3.106362,
-60.025826,
)
),
"336º"
);
}
}