Fix color matching function

This commit is contained in:
hal8174 2025-05-25 19:55:38 +02:00
parent e3009563ba
commit 543bf7e1bf
Signed by: hal8174
SSH key fingerprint: SHA256:JwuqS+eVfISfKr+DkDQ6NWAbGd1jFAHkPpCM1yCnlTs
6 changed files with 241 additions and 73 deletions

View file

@ -0,0 +1,102 @@
use core::f32;
use plotters::{prelude::*, style::full_palette::GREEN};
use rand::{rngs::SmallRng, Rng, SeedableRng};
use ray_tracing_material::iridescent::Iridescent;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let root = BitMapBackend::new("iridescent_sweep.png", (800, 600)).into_drawing_area();
root.fill(&WHITE)?;
let mut chart = ChartBuilder::on(&root)
.margin(5)
.x_label_area_size(30)
.y_label_area_size(30)
.build_cartesian_2d(0f32..f32::consts::FRAC_PI_2, 0f32..1f32)?;
chart.configure_mesh().draw()?;
let (pixel_range_x, pixel_range_y) = chart.plotting_area().get_pixel_range();
let buckets = pixel_range_x.end - pixel_range_x.start;
let height_per_pixel = 1.0 / (pixel_range_y.end - pixel_range_y.start) as f32;
let samples = 10000;
let m = Iridescent::new(0.5 * 244.0, 0.5 * 244.0, 1.0, 1.5, 20);
let mut data = Vec::new();
let mut rng = SmallRng::seed_from_u64(0);
let plotting_area = chart.plotting_area();
for i in 0..buckets {
let mut s = ray_tracing_core::color::Color::black();
let mut s_wavelength = ray_tracing_core::color::Color::black();
for _ in 0..samples {
let theta1 = rng.gen_range(
(f32::consts::FRAC_PI_2 * (i as f32 / buckets as f32))
..=(f32::consts::FRAC_PI_2 * ((i + 1) as f32 / buckets as f32)),
);
s += m.monte_carlo_reflectance(theta1, &mut rng);
s_wavelength += ray_tracing_core::color::Color::new(
m.averaged_reflectance(595.0, theta1),
m.averaged_reflectance(556.0, theta1),
m.averaged_reflectance(442.0, theta1),
);
}
let c = s / samples as f32;
// data.push(c);
data.push(s_wavelength / samples as f32);
// dbg!(c);
for j in 0..10 {
plotting_area
.draw_pixel(
(
f32::consts::FRAC_PI_2 * (i as f32 / buckets as f32),
1.0 - (height_per_pixel * (j as f32)),
),
&RGBColor(
(c.r() * 256.0) as u8,
(c.g() * 256.0) as u8,
(c.b() * 256.0) as u8,
),
)
.unwrap();
}
}
chart.draw_series(LineSeries::new(
data.iter().enumerate().map(|(i, c)| {
(
(f32::consts::FRAC_PI_2 * (i as f32 / buckets as f32)),
c.r(),
)
}),
&RED,
))?;
chart.draw_series(LineSeries::new(
data.iter().enumerate().map(|(i, c)| {
(
(f32::consts::FRAC_PI_2 * (i as f32 / buckets as f32)),
c.g(),
)
}),
&GREEN,
))?;
chart.draw_series(LineSeries::new(
data.iter().enumerate().map(|(i, c)| {
(
(f32::consts::FRAC_PI_2 * (i as f32 / buckets as f32)),
c.b(),
)
}),
&BLUE,
))?;
root.present()?;
Ok(())
}