geo/algorithm/rhumb/
bearing.rs1use 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)]
9pub trait RhumbBearing<T: CoordFloat + FromPrimitive> {
14 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}