Add debugging hit DebugHit. Move some color helpers from mandelbrot to colors mod. Implement Texture trait for [f32;3]
47 lines
1.2 KiB
Rust
47 lines
1.2 KiB
Rust
use rand::{self, Rng};
|
|
|
|
use crate::vec3::Vec3;
|
|
|
|
// HSV values in [0..1]
|
|
// returns [r, g, b] values from 0 to 255
|
|
//From https://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/
|
|
pub fn hsv_to_rgb(h: f32, s: f32, v: f32) -> Vec3 {
|
|
let h_i = (h * 6.) as i32;
|
|
let f = h * 6. - h_i as f32;
|
|
let p = v * (1. - s);
|
|
let q = v * (1. - f * s);
|
|
let t = v * (1. - (1. - f) * s);
|
|
match h_i {
|
|
0 => Vec3::new(v, t, p),
|
|
1 => Vec3::new(q, v, p),
|
|
2 => Vec3::new(p, v, t),
|
|
3 => Vec3::new(p, q, v),
|
|
4 => Vec3::new(t, p, v),
|
|
5 => Vec3::new(v, p, q),
|
|
_ => panic!("Unknown H value {}", h_i),
|
|
}
|
|
}
|
|
|
|
pub fn generate_rainbow(num: usize) -> Vec<Vec3> {
|
|
(0..num)
|
|
.map(|n| {
|
|
let h = n as f32 / num as f32;
|
|
hsv_to_rgb(h, 0.99, 0.99)
|
|
})
|
|
.collect()
|
|
}
|
|
pub fn generate_palette(num: usize) -> Vec<Vec3> {
|
|
let mut rng = rand::thread_rng();
|
|
let mut random = || rng.gen();
|
|
// use golden ratio
|
|
let golden_ratio_conjugate = 0.618_034;
|
|
let mut h = random();
|
|
(0..num)
|
|
.map(|_| {
|
|
h += golden_ratio_conjugate;
|
|
h %= 1.0;
|
|
hsv_to_rgb(h, 0.99, 0.99)
|
|
})
|
|
.collect()
|
|
}
|