geo/algorithm/
convert_angle_unit.rs

1use geo_types::Coord;
2use geo_types::CoordFloat;
3
4use crate::{MapCoords, MapCoordsInPlace};
5
6pub trait ToRadians<T: CoordFloat>:
7    Sized + MapCoords<T, T, Output = Self> + MapCoordsInPlace<T>
8{
9    fn to_radians(&self) -> Self {
10        self.map_coords(|Coord { x, y }| Coord {
11            x: x.to_radians(),
12            y: y.to_radians(),
13        })
14    }
15
16    fn to_radians_in_place(&mut self) {
17        self.map_coords_in_place(|Coord { x, y }| Coord {
18            x: x.to_radians(),
19            y: y.to_radians(),
20        })
21    }
22}
23impl<T: CoordFloat, G: MapCoords<T, T, Output = Self> + MapCoordsInPlace<T>> ToRadians<T> for G {}
24
25pub trait ToDegrees<T: CoordFloat>:
26    Sized + MapCoords<T, T, Output = Self> + MapCoordsInPlace<T>
27{
28    fn to_degrees(&self) -> Self {
29        self.map_coords(|Coord { x, y }| Coord {
30            x: x.to_degrees(),
31            y: y.to_degrees(),
32        })
33    }
34
35    fn to_degrees_in_place(&mut self) {
36        self.map_coords_in_place(|Coord { x, y }| Coord {
37            x: x.to_degrees(),
38            y: y.to_degrees(),
39        })
40    }
41}
42impl<T: CoordFloat, G: MapCoords<T, T, Output = Self> + MapCoordsInPlace<T>> ToDegrees<T> for G {}
43
44#[cfg(test)]
45mod tests {
46    use std::f64::consts::PI;
47
48    use approx::assert_relative_eq;
49    use geo_types::Line;
50
51    use super::*;
52
53    fn line_degrees_mock() -> Line {
54        Line::new((90.0, 180.), (0., -90.))
55    }
56
57    fn line_radians_mock() -> Line {
58        Line::new((PI / 2., PI), (0., -PI / 2.))
59    }
60
61    #[test]
62    fn converts_to_radians() {
63        assert_relative_eq!(line_radians_mock(), line_degrees_mock().to_radians())
64    }
65
66    #[test]
67    fn converts_to_radians_in_place() {
68        let mut line = line_degrees_mock();
69        line.to_radians_in_place();
70        assert_relative_eq!(line_radians_mock(), line)
71    }
72
73    #[test]
74    fn converts_to_degrees() {
75        assert_relative_eq!(line_degrees_mock(), line_radians_mock().to_degrees())
76    }
77
78    #[test]
79    fn converts_to_degrees_in_place() {
80        let mut line = line_radians_mock();
81        line.to_degrees_in_place();
82        assert_relative_eq!(line_degrees_mock(), line)
83    }
84}