bracket_geometry/
angles.rs

1use crate::prelude::{Point, Radians};
2
3/// From a given start point, project forward radius units at an angle of angle_radians degrees.
4/// 0 Degrees is north (negative Y), 90 degrees is east (positive X)
5pub 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)); // 180 degrees
27        assert_eq!(dest, Point::new(0, 10));
28
29        dest = project_angle(start, 10.0, Radians::new(std::f32::consts::PI / 2.0)); // 90 degrees, east
30        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        ); // 270 degrees, west
37        assert_eq!(dest, Point::new(-10, 0));
38
39        dest = project_angle(start, 10.0, Radians::new(std::f32::consts::FRAC_PI_4)); // 45 degrees, north-east
40        assert_eq!(dest, Point::new(7, -7));
41
42        dest = project_angle(start, 10.0, Degrees::new(135.0)); // 135 degrees, south-east
43        assert_eq!(dest, Point::new(7, 7));
44
45        dest = project_angle(start, 10.0, Degrees::new(225.0)); // 225 degrees, south-west
46        assert_eq!(dest, Point::new(-7, 7));
47
48        dest = project_angle(start, 10.0, Degrees::new(315.0)); // 315 degrees, north-west
49        assert_eq!(dest, Point::new(-7, -7));
50    }
51}