1use crate::types::{Heading, UnitsExt};
2
3pub fn modf(a: f32, b: f32) -> f32 {
4 (a % b + b) % b
5}
6
7pub fn modi(a: i32, b: i32) -> i32 {
8 (a % b + b) % b
9}
10
11pub fn normalize_angle(Heading(angle): Heading) -> Heading {
13 let temp = modf(angle, 360.0);
14 if temp > 180.0 {
15 Heading(temp - 360.0)
16 } else {
17 Heading(temp)
18 }
19}
20
21pub fn subtract_angles(Heading(a): Heading, Heading(b): Heading) -> Heading {
23 normalize_angle((modf(a, 360.0) - modf(b, 360.0)).ang())
25}
26
27pub fn add_angles(Heading(a): Heading, Heading(b): Heading) -> Heading {
28 normalize_angle((modf(a, 360.0) + modf(b, 360.0)).ang())
30}
31
32pub fn lerp_angles(alpha: f32, a: Heading, b: Heading) -> Heading {
33 let alpha = alpha.min(1.0).max(0.0);
34
35 let delta = subtract_angles(b, a).0;
37 let offset = delta * alpha;
38 add_angles(a, Heading(offset))
39}