fll_rs/
math.rs

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
11/// Normalizes an angle in degrees to a number in (-180, 180)
12pub 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
21/// Caculates the distance in degrees between to angles
22pub fn subtract_angles(Heading(a): Heading, Heading(b): Heading) -> Heading {
23    // TODO check correctness
24    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    // TODO check correctness
29    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    // TODO check correctness
36    let delta = subtract_angles(b, a).0;
37    let offset = delta * alpha;
38    add_angles(a, Heading(offset))
39}