use crate::{color::Color, Sample}; #[derive(Clone)] pub struct Rainbow; impl Sample for Rainbow { fn sample(&mut self, x: f64, _y: f64) -> Color { static PI: f64 = 3.14; let x = x * PI * 2.0; return Color { r: (x + PI / 3.0 * 0.0).sin() * 0.5 + 0.5, g: (x + PI / 3.0 * 2.0).sin() * 0.5 + 0.5, b: (x + PI / 3.0 * 4.0).sin() * 0.5 + 0.5, }; } fn clone(&self) -> Box { box Clone::clone(self) } } #[derive(Clone)] pub struct Sequence(pub Vec); impl Sample for Sequence { fn sample(&mut self, x: f64, _y: f64) -> Color { self.0[x.rem_euclid(self.0.len() as f64) as usize] } fn clone(&self) -> Box { box Clone::clone(self) } } #[derive(Clone)] pub struct Gradient(pub Vec); impl Sample for Gradient { fn sample(&mut self, x: f64, _y: f64) -> Color { let index_int = x.floor() as usize; let index_error = x % 1.0; let a = self.0[index_int % self.0.len()]; let b = self.0[(index_int + 1) % self.0.len()]; Color::mix(a, b, index_error) } fn clone(&self) -> Box { box Clone::clone(self) } } #[derive(Clone)] pub struct Solid(pub Color); impl Sample for Solid { fn sample(&mut self, _x: f64, _y: f64) -> Color { self.0 } fn clone(&self) -> Box { box Clone::clone(self) } }