material_color_utilities/utils/
math.rs1use num_traits::{FromPrimitive, Num, Signed};
2
3#[inline]
4pub fn lerp<T>(start: T, stop: T, amount: T) -> T
5where
6 T: Num + FromPrimitive + Copy,
7{
8 (T::from_f64(1.0).unwrap() - amount) * start + amount * stop
9}
10
11pub fn sanitize_degrees<T>(mut degrees: T) -> T
12where
13 T: Num + PartialOrd + FromPrimitive,
14{
15 let zero = T::from_f64(0.0).unwrap();
16 degrees = degrees % T::from_f64(360.0).unwrap();
17 if degrees < zero {
18 degrees = degrees + T::from_f64(360.0).unwrap();
19 }
20 degrees
21}
22
23pub fn rotation_direction<T>(from: T, to: T) -> T
24where
25 T: Num + PartialOrd + FromPrimitive,
26{
27 let increasing_difference = sanitize_degrees(to - from);
28 if increasing_difference <= T::from_f64(180.0).unwrap() {
29 T::from_f64(1.0).unwrap()
30 } else {
31 T::from_f64(-1.0).unwrap()
32 }
33}
34
35pub fn difference_degrees<T>(a: T, b: T) -> T
36where
37 T: Num + Signed + FromPrimitive,
38{
39 T::from_f64(180.0).unwrap() - ((a - b).abs() - T::from_f64(180.0).unwrap()).abs()
40}
41
42pub fn matrix_multiply<T>(row: &[T; 3], matrix: &[[T; 3]; 3]) -> [T; 3]
43where
44 T: Num + Copy,
45{
46 let a = row[0] * matrix[0][0] + row[1] * matrix[0][1] + row[2] * matrix[0][2];
47 let b = row[0] * matrix[1][0] + row[1] * matrix[1][1] + row[2] * matrix[1][2];
48 let c = row[0] * matrix[2][0] + row[1] * matrix[2][1] + row[2] * matrix[2][2];
49 [a, b, c]
50}