geo/algorithm/
convert_angle_unit.rs1use 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}