diff --git a/src/render.rs b/src/render.rs index 3dcaca3..72e3fb0 100644 --- a/src/render.rs +++ b/src/render.rs @@ -9,20 +9,6 @@ use std::fs::File; use std::path::PathBuf; use y4m; -// fn clamp(v: f32, range: f32) -> f32 { -// v.min(range).max(-range) -// } - -// fn curl(x: f64, y: f64) -> f64 { -// let c = x * y; -// if c >= 0.0 { -// c.sqrt() -// } else { -// -(-c).sqrt() -// } -// } -// - /// Accept a value from (-\inf, \inf) and return a value in (-1, 1). /// If the input is equal to `typical`, it will be mapped to 0.5. /// If the input is equal to -`typical`, it will be mapped to -0.5. @@ -77,16 +63,8 @@ impl SimStateRenderExt for SimState { for y in 0..h { for x in 0..w { let cell = self.get(x as usize, y as usize); - //let r = norm_color(cell.bz() * consts::C); - //let r = 0; let r = scale_signed_to_u8(cell.mat().mz(), 100.0); let b = scale_unsigned_to_u8(cell.mat().conductivity(), 10.0); - //let b = 0; - //let b = norm_color(cell.ey()); - //let g = 0; - //let g = norm_color(cell.ex()); - //let g = norm_color(curl(cell.ex(), cell.ey())); - //let g = norm_color((cell.bz() * 1.0e4).into()); let g = scale_signed_to_u8(cell.bz(), 1.0e-4); image.put_pixel(x, y, Rgb([r, g, b])); } @@ -95,10 +73,11 @@ impl SimStateRenderExt for SimState { for y in 0..h { for x in 0..w { if x % evec_spacing == 0 && y % evec_spacing == 0 { - let mut vec = self.e_vector(x, y, evec_spacing) * 0.01; - let vec = scale_vector(self.e_vector(x, y, evec_spacing), 100.0) * (evec_spacing as f64); + let norm_vec = scale_vector(self.e_vector(x, y, evec_spacing), 100.0); + let alpha = norm_vec.mag_sq().powf(0.33); + let vec = norm_vec * (evec_spacing as f64); let center = Point::new(x as _, y as _) + Point::new(evec_spacing as _, evec_spacing as _)*0.5; - image.draw_field_arrow(center, vec, Rgb([0xff, 0xff, 0xff])); + image.draw_field_arrow(center, vec, Rgb([0xff, 0xff, 0xff]), alpha as f32); } } } @@ -130,24 +109,23 @@ impl SimStateRenderExt for SimState { } trait ImageRenderExt { - fn draw_field_arrow(&mut self, center: Point, rel: Point, color: Rgb); + fn draw_field_arrow(&mut self, center: Point, rel: Point, color: Rgb, alpha: f32); } impl ImageRenderExt for RgbImage { - fn draw_field_arrow(&mut self, center: Point, rel: Point, color: Rgb) { + fn draw_field_arrow(&mut self, center: Point, rel: Point, color: Rgb, alpha: f32) { let start = (center - rel * 0.5).round(); let end = (center + rel * 0.5).round(); let i_start = (start.x() as _, start.y() as _); let i_end = (end.x() as _, end.y() as _); - drawing::draw_antialiased_line_segment_mut(self, i_start, i_end, color, pixelops::interpolate); + let interpolate_with_alpha = |left, right, left_weight| { + pixelops::interpolate(left, right, left_weight*alpha) + }; + drawing::draw_antialiased_line_segment_mut(self, i_start, i_end, color, interpolate_with_alpha); //drawing::draw_line_segment_mut(self, i_start, i_end, color); } } -fn norm_color(v: f64) -> u8 { - (v * 64.0 + 128.0).max(0.0).min(255.0) as u8 -} - pub trait Renderer { fn render(&mut self, state: &SimState); }