From 5f5d198e04a32483c20b389e43063184487df658 Mon Sep 17 00:00:00 2001 From: mindv0rtex Date: Sat, 27 Feb 2021 00:46:51 -0500 Subject: [PATCH] First image has been generated! --- src/grid.rs | 17 +++++++++++++++++ src/main.rs | 5 ++--- src/model.rs | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/grid.rs b/src/grid.rs index 80fd1ec..f0694ba 100644 --- a/src/grid.rs +++ b/src/grid.rs @@ -63,6 +63,23 @@ impl Grid { self.blur .run(&mut self.data, &mut self.buf, radius as f32, decay_factor); } + + pub fn quantile(&self, fraction: f32) -> f32 { + let index = if fraction == 1.0 { + self.data.len() - 1 + } else { + (self.data.len() as f32 * fraction) as usize + }; + let mut sorted = self.data.clone(); + sorted + .as_mut_slice() + .select_nth_unstable_by(index, |a, b| a.partial_cmp(b).unwrap()); + sorted[index] + } + + pub fn data(&self) -> &[f32] { + &self.data + } } #[cfg(test)] diff --git a/src/main.rs b/src/main.rs index 3143b55..0fd4649 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,9 @@ use physarum::model; fn main() { - let mut model = model::Model::new(4, 4, 20, 1); + let mut model = model::Model::new(128, 128, 4096, 1); println!("{:#?}", model); model.step(); - println!("{:#?}", model); model.step(); - println!("{:#?}", model); + model.save_to_image(); } diff --git a/src/model.rs b/src/model.rs index 1189d10..6e51515 100644 --- a/src/model.rs +++ b/src/model.rs @@ -176,4 +176,18 @@ impl Model { .diffuse(self.diffusivity, self.config.decay_factor); self.iteration += 1; } + + /// Output the current trail layer as a grayscale image. + pub fn save_to_image(&self) { + let mut img = image::GrayImage::new(self.width as u32, self.height as u32); + let max_value = self.grid.quantile(0.999); + + for (i, value) in self.grid.data().iter().enumerate() { + let x = (i % self.width) as u32; + let y = (i / self.width) as u32; + let c = (value / max_value).clamp(0.0, 1.0) * 255.0; + img.put_pixel(x, y, image::Luma([c as u8])); + } + img.save("out.png").unwrap(); + } }