geo/algorithm/rhumb/
bearing.rs

1use num_traits::FromPrimitive;
2
3use crate::{Bearing, CoordFloat, Point, Rhumb};
4
5#[deprecated(
6    since = "0.29.0",
7    note = "Please use the `Rhumb.bearing` method from the `Bearing` trait instead"
8)]
9/// Returns the bearing to another Point in degrees.
10///
11/// Bullock, R.: Great Circle Distances and Bearings Between Two Locations, 2007.
12/// (<https://dtcenter.org/met/users/docs/write_ups/gc_simple.pdf>)
13pub trait RhumbBearing<T: CoordFloat + FromPrimitive> {
14    /// Returns the bearing to another Point in degrees along a [rhumb line], where North is 0° and East is 90°.
15    ///
16    /// # Examples
17    ///
18    /// ```
19    /// # use approx::assert_relative_eq;
20    /// # #[allow(deprecated)]
21    /// use geo::RhumbBearing;
22    /// use geo::Point;
23    ///
24    /// let p_1 = Point::new(9.177789688110352, 48.776781529534965);
25    /// let p_2 = Point::new(9.274348757829898, 48.84037308229984);
26    /// # #[allow(deprecated)]
27    /// let bearing = p_1.rhumb_bearing(p_2);
28    /// assert_relative_eq!(bearing, 45., epsilon = 1.0e-6);
29    /// ```
30    /// [rhumb line]: https://en.wikipedia.org/wiki/Rhumb_line
31    fn rhumb_bearing(&self, point: Point<T>) -> T;
32}
33
34#[allow(deprecated)]
35impl<T> RhumbBearing<T> for Point<T>
36where
37    T: CoordFloat + FromPrimitive,
38{
39    fn rhumb_bearing(&self, point: Point<T>) -> T {
40        Rhumb.bearing(*self, point)
41    }
42}
43
44#[cfg(test)]
45mod test {
46    #[allow(deprecated)]
47    use crate::RhumbBearing;
48    #[allow(deprecated)]
49    use crate::RhumbDestination;
50    use crate::point;
51
52    #[test]
53    fn north_bearing() {
54        let p_1 = point!(x: 9., y: 47.);
55        let p_2 = point!(x: 9., y: 48.);
56        #[allow(deprecated)]
57        let bearing = p_1.rhumb_bearing(p_2);
58        assert_relative_eq!(bearing, 0.);
59    }
60
61    #[test]
62    fn equatorial_east_bearing() {
63        let p_1 = point!(x: 9., y: 0.);
64        let p_2 = point!(x: 10., y: 0.);
65        #[allow(deprecated)]
66        let bearing = p_1.rhumb_bearing(p_2);
67        assert_relative_eq!(bearing, 90.);
68    }
69
70    #[test]
71    fn east_bearing() {
72        let p_1 = point!(x: 9., y: 10.);
73        let p_2 = point!(x: 18.131938299366652, y: 10.);
74
75        #[allow(deprecated)]
76        let bearing = p_1.rhumb_bearing(p_2);
77        assert_relative_eq!(bearing, 90.);
78    }
79
80    #[test]
81    fn northeast_bearing() {
82        let p_1 = point!(x: 9.177789688110352f64, y: 48.776781529534965);
83        let p_2 = point!(x: 9.274348757829898, y: 48.84037308229984);
84        #[allow(deprecated)]
85        let bearing = p_1.rhumb_bearing(p_2);
86        assert_relative_eq!(bearing, 45., epsilon = 1.0e-6);
87    }
88
89    #[test]
90    fn consistent_with_destination() {
91        let p_1 = point!(x: 9.177789688110352f64, y: 48.776781529534965);
92        #[allow(deprecated)]
93        let p_2 = p_1.rhumb_destination(45., 10000.);
94
95        #[allow(deprecated)]
96        let b_1 = p_1.rhumb_bearing(p_2);
97        assert_relative_eq!(b_1, 45., epsilon = 1.0e-6);
98    }
99}