lodestone_core/points/
rotation_2d.rs1use crate::points::Point2;
2
3pub 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
10pub 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}