Snapshot and decimate before rendering; add an explicit boundary layer
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user