1fn lerp(a: u8, b: u8, t: f32) -> u8 {
2 (a as f32 * (1.0 - t) + b as f32 * t).round() as u8
3}
4
5#[derive(Clone, Copy)]
6pub struct Color {
7 pub r: u8,
8 pub g: u8,
9 pub b: u8,
10}
11
12pub fn two_step_color_gradient(
13 start_color: Color,
14 middle_color: Color,
15 end_color: Color,
16 middle_point: usize,
17 length: usize,
18) -> Vec<Color> {
19 let mut gradient = vec![];
20 for i in 1..=length {
21 let (r, g, b) = if i <= middle_point {
22 let t = i as f32 / middle_point as f32;
23 (
24 lerp(start_color.r, middle_color.r, t),
25 lerp(start_color.g, middle_color.g, t),
26 lerp(start_color.b, middle_color.b, t),
27 )
28 } else {
29 let t = (i - middle_point) as f32 / middle_point as f32;
30 (
31 lerp(middle_color.r, end_color.r, t),
32 lerp(middle_color.g, end_color.g, t),
33 lerp(middle_color.b, end_color.b, t),
34 )
35 };
36 gradient.push(Color { r, g, b });
37 }
38 gradient
39}