lodestone_core/points/
rotation_2d.rs

1use crate::points::Point2;
2
3/// Rotates a 2D point `Point2` about an angle `alpha`
4pub fn rotate_point2(point: &Point2, alpha: &f64) -> Point2 {
5    let x_rot = point.x * alpha.cos() - point.y * alpha.sin();
6    let y_rot = point.x * alpha.sin() + point.y * alpha.cos();
7    Point2::new(x_rot, y_rot)
8}
9
10/// Rotates a 2D point tuple`(x,y)` about an angle `alpha`
11pub fn rotate_tuple2(point: (&f64, &f64), alpha: &f64) -> (f64, f64) {
12    let x_rot = point.0 * alpha.cos() - point.1 * alpha.sin();
13    let y_rot = point.0 * alpha.sin() + point.1 * alpha.cos();
14    (x_rot, y_rot)
15}
16
17#[cfg(test)]
18mod tests {
19    use super::{rotate_point2, rotate_tuple2, Point2};
20    use crate::utils::comparison::nearly_equal;
21
22    #[test]
23    fn test_rotate_point2_90() {
24        let point = Point2::new(1.0, 1.0);
25        let rot_point = rotate_point2(&point, &90.0_f64.to_radians());
26        assert!(nearly_equal(-1.0, rot_point.x));
27        assert!(nearly_equal(1.0, rot_point.y));
28    }
29
30    #[test]
31    fn test_rotate_point2_180() {
32        let point = Point2::new(1.0, 1.0);
33        let rot_point = rotate_point2(&point, &180.0_f64.to_radians());
34        assert!(nearly_equal(-1.0, rot_point.x));
35        assert!(nearly_equal(-1.0, rot_point.y));
36    }
37
38    #[test]
39    fn test_rotate_point2_270() {
40        let point = Point2::new(1.0, 1.0);
41        let rot_point = rotate_point2(&point, &270.0_f64.to_radians());
42        assert!(nearly_equal(1.0, rot_point.x));
43        assert!(nearly_equal(-1.0, rot_point.y));
44    }
45
46    #[test]
47    fn test_rotate_tuple2_90() {
48        let point = (&1.0, &1.0);
49        let rot_point = rotate_tuple2(point, &90.0_f64.to_radians());
50        assert!(nearly_equal(-1.0, rot_point.0));
51        assert!(nearly_equal(1.0, rot_point.1));
52    }
53
54    #[test]
55    fn test_rotate_tuple2_180() {
56        let point = (&1.0, &1.0);
57        let rot_point = rotate_tuple2(point, &180.0_f64.to_radians());
58        assert!(nearly_equal(-1.0, rot_point.0));
59        assert!(nearly_equal(-1.0, rot_point.1));
60    }
61
62    #[test]
63    fn test_rotate_tuple2_270() {
64        let point = (&1.0, &1.0);
65        let rot_point = rotate_tuple2(point, &270.0_f64.to_radians());
66        assert!(nearly_equal(1.0, rot_point.0));
67        assert!(nearly_equal(-1.0, rot_point.1));
68    }
69
70    #[test]
71    fn test_rotate_tuple2_45_x_axis() {
72        let point = (&1.0, &0.0);
73        let rot_point = rotate_tuple2(point, &45.0_f64.to_radians());
74
75        let rot_x = nearly_equal(1.0 / 2.0_f64.sqrt(), rot_point.0);
76        let rot_y = nearly_equal(1.0 / 2.0_f64.sqrt(), rot_point.1);
77        println!("Result: {:?}", rot_point);
78        assert!(rot_x, "x false");
79        assert!(rot_y, "y false");
80    }
81
82    #[test]
83    fn test_rotate_tuple2_45_yaxis() {
84        let point = (&0.0, &1.0);
85        let alpha = -45.0_f64.to_radians();
86        println!("Alpha : {}", alpha);
87        let rot_point = rotate_tuple2(point, &alpha);
88
89        let rot_x = nearly_equal(1.0 / 2.0_f64.sqrt(), rot_point.0);
90        let rot_y = nearly_equal(1.0 / 2.0_f64.sqrt(), rot_point.1);
91        println!("Result: {:?}", rot_point);
92        assert!(rot_x, "x false");
93        assert!(rot_y, "y false");
94    }
95}