Snapshot and decimate before rendering; add an explicit boundary layer

This commit is contained in:
2020-09-07 17:42:05 -07:00
parent 5d9c086137
commit 14fa68bfb2
4 changed files with 107 additions and 27 deletions

View File

@@ -1,6 +1,6 @@
use ansi_term::Color::RGB;
use crate::geom::Point;
use crate::{Material as _, SimState};
use crate::{Material as _, SimSnapshot, SimState};
use decorum::R64;
use image::{RgbImage, Rgb};
use imageproc::{pixelops, drawing};
@@ -49,12 +49,12 @@ fn scale_vector(x: Point, typical_mag: f64) -> Point {
x.with_mag(new_mag)
}
trait SimStateRenderExt {
trait SimSnapshotRenderExt {
fn to_image(&self) -> RgbImage;
fn e_vector(&self, xidx: u32, yidx: u32, size: u32) -> Point;
}
impl SimStateRenderExt for SimState {
impl SimSnapshotRenderExt for SimSnapshot {
fn to_image(&self) -> RgbImage {
let w = self.width().try_into().unwrap();
let h = self.height().try_into().unwrap();
@@ -64,7 +64,7 @@ impl SimStateRenderExt for SimState {
for x in 0..w {
let cell = self.get(x as usize, y as usize);
let r = scale_signed_to_u8(cell.mat().mz(), 100.0);
let b = scale_unsigned_to_u8(cell.mat().conductivity(), 3.0);
let b = scale_unsigned_to_u8(cell.mat().conductivity(), 10.0);
let g = scale_signed_to_u8(cell.bz(), 1.0e-4);
image.put_pixel(x, y, Rgb([r, g, b]));
}
@@ -128,10 +128,10 @@ impl ImageRenderExt for RgbImage {
}
pub trait Renderer {
fn render(&mut self, state: &SimState) {
fn render(&mut self, state: &SimSnapshot) {
self.render_with_image(state, &state.to_image());
}
fn render_with_image(&mut self, state: &SimState, _im: &RgbImage) {
fn render_with_image(&mut self, state: &SimSnapshot, _im: &RgbImage) {
self.render(state);
}
}
@@ -139,7 +139,7 @@ pub trait Renderer {
pub struct NumericTermRenderer;
impl Renderer for NumericTermRenderer {
fn render(&mut self, state: &SimState) {
fn render(&mut self, state: &SimSnapshot) {
for y in 0..state.height() {
for x in 0..state.width() {
let cell = state.get(x, y);
@@ -159,7 +159,7 @@ impl Renderer for NumericTermRenderer {
pub struct ColorTermRenderer;
impl Renderer for ColorTermRenderer {
fn render_with_image(&mut self, state: &SimState, im: &RgbImage) {
fn render_with_image(&mut self, state: &SimSnapshot, im: &RgbImage) {
let square = "";
let buf: String = im
.enumerate_rows()
@@ -189,7 +189,7 @@ impl Y4MRenderer {
}
impl Renderer for Y4MRenderer {
fn render_with_image(&mut self, _state: &SimState, im: &RgbImage) {
fn render_with_image(&mut self, _state: &SimSnapshot, im: &RgbImage) {
if self.encoder.is_none() {
let writer = File::create(&self.out_path).unwrap();
self.encoder = Some(y4m::encode(im.width() as usize, im.height() as usize, y4m::Ratio::new(30, 1))
@@ -236,16 +236,24 @@ impl MultiRenderer {
self.push(r);
self
}
pub fn render(&mut self, state: &SimState) {
//let max_width = 1980; //< TODO: make configurable
let max_width = 200;
let dec = (state.width() as u32 + max_width - 1) / max_width;
let snap = state.snapshot(dec);
Renderer::render(self, &snap);
}
}
impl Renderer for MultiRenderer {
fn render(&mut self, state: &SimState) {
fn render(&mut self, state: &SimSnapshot) {
if self.renderers.len() != 0 {
self.render_with_image(state, &state.to_image());
}
}
fn render_with_image(&mut self, state: &SimState, im: &RgbImage) {
fn render_with_image(&mut self, state: &SimSnapshot, im: &RgbImage) {
for r in &mut self.renderers {
r.render_with_image(state, im);
}