bracket_geometry/
angles.rs1use crate::prelude::{Point, Radians};
2
3pub fn project_angle<ANGLE>(start: Point, radius: f32, angle_radians: ANGLE) -> Point
6where
7 ANGLE: Into<Radians>,
8{
9 let degrees_radians = angle_radians.into().0 + std::f32::consts::PI;
10 Point::new(
11 (0.0 - (start.x as f32 + radius * f32::sin(degrees_radians))) as i32,
12 (start.y as f32 + radius * f32::cos(degrees_radians)) as i32,
13 )
14}
15
16#[cfg(test)]
17mod tests {
18 use crate::prelude::{project_angle, Degrees, Point, Radians};
19
20 #[test]
21 fn test_project_angle() {
22 let start = Point::new(0, 0);
23 let mut dest = project_angle(start, 10.0, Radians::new(0.0));
24 assert_eq!(dest, Point::new(0, -10));
25
26 dest = project_angle(start, 10.0, Radians::new(std::f32::consts::PI)); assert_eq!(dest, Point::new(0, 10));
28
29 dest = project_angle(start, 10.0, Radians::new(std::f32::consts::PI / 2.0)); assert_eq!(dest, Point::new(10, 0));
31
32 dest = project_angle(
33 start,
34 10.0,
35 Radians::new(std::f32::consts::PI + (std::f32::consts::PI / 2.0)),
36 ); assert_eq!(dest, Point::new(-10, 0));
38
39 dest = project_angle(start, 10.0, Radians::new(std::f32::consts::FRAC_PI_4)); assert_eq!(dest, Point::new(7, -7));
41
42 dest = project_angle(start, 10.0, Degrees::new(135.0)); assert_eq!(dest, Point::new(7, 7));
44
45 dest = project_angle(start, 10.0, Degrees::new(225.0)); assert_eq!(dest, Point::new(-7, 7));
47
48 dest = project_angle(start, 10.0, Degrees::new(315.0)); assert_eq!(dest, Point::new(-7, -7));
50 }
51}