vizkit 0.1.1

A rendering-agnostic kit for data visualization
Documentation
use super::color::{Color, Cubehelix};

pub fn rainbow<T>(t: f32) -> T
where
    Color: Into<T>,
{
    let mut t = t;
    // t < 0. || t > 1.
    if !(0. ..=1.).contains(&t) {
        t -= t.floor();
    }
    let ts = (t - 0.5).abs();
    Color::from(Cubehelix([360. * t - 100., 1.5 - 1.5 * ts, 0.8 - 0.9 * ts])).into()
}

#[cfg(test)]
mod tests {
    use super::rainbow;

    #[test]
    fn test_rainbow() {
        let step = 100;
        let colors: Vec<[f32; 3]> = (0..=step)
            .map(|i| rainbow(i as f32 / step as f32))
            .collect();
        for color in colors {
            let [r, g, b] = color;
            assert!(
                (0. ..=1.).contains(&r),
                "red must be between [0, 1] (rainbow)",
            );
            assert!(
                (0. ..=1.).contains(&g),
                "green must be between [0, 1] (rainbow)",
            );
            assert!(
                (0. ..=1.).contains(&b),
                "blue must be between [0, 1] (rainbow)",
            );
        }
    }
}