From 36d838280dc2aa38d56dd9bbd9bcd83428551b55 Mon Sep 17 00:00:00 2001 From: Nilstrieb Date: Tue, 9 Mar 2021 10:57:21 +0100 Subject: [PATCH] single pass --- img.png | Bin 5126 -> 31853 bytes src/MandelbrotSet.java | 213 ----------------------------------------- src/lib.rs | 148 +++++++++++++++------------- 3 files changed, 83 insertions(+), 278 deletions(-) delete mode 100644 src/MandelbrotSet.java diff --git a/img.png b/img.png index 2bae902b2a237722c8aff2cf4a07dcc0b654317e..f6791b25d6e5525311a0468e1962e0749921ec02 100644 GIT binary patch literal 31853 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 - int frames = 100; - int width = 1920; - //................................................................................ - - // less important settings - boolean advancedIndicators = true; - double forceCenterX = interestingPoints[pointNumber][0]; - double forceCenterY = interestingPoints[pointNumber][1]; - boolean imageMode = true; - int height = 1080; - boolean locked = true; - float ratio = 2 / 3f; // .2 for editor 2/3 for image - double zoom = 1; - int iterations; - double threshold = 100; - char low = ' '; - char HIGH = '#'; - - if (quality == 0) { - iterations = 20; - } else if (quality == 1) { - iterations = 50; - } else if (quality == 2) { - iterations = 100; - } else if (quality == 3) { - iterations = 500; - } else if (quality == 4) { - iterations = 1000; - } else { - iterations = quality; - } - - double offsetX; - double offsetY; - if (locked) { - height = (int) ((float) width * ratio); - } - - // TIME - long startTime = System.currentTimeMillis(); - - for (int frameCounter = 0; frameCounter < frames; frameCounter++) { - // progress = 0; - BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - File f = null; - - // the printed image is 3 * 2 (from x = -3 to x = 1 and - double stepSizeX = (3 / (float) width) / zoom; - double stepSizeY = (2 / (float) height) / zoom; - - offsetX = forceCenterX - width / 2 * stepSizeX; - offsetY = -(forceCenterY - height / 2 * stepSizeY); - - // calculate coords using stepSize and hardcoded corner coords: - // create an array of complex numbers, where the position of each sample will be stored - CNumber[][] coords = new CNumber[width][height]; - - - for (int i = 0; i < width; i++) { - for (int j = 0; j < height; j++) { - coords[i][j] = new CNumber(); // fill the array - coords[i][j].real = offsetX + stepSizeX * i; // calculate the position on the real numberline - coords[i][j].imag = offsetY - stepSizeY * j; // calculate the position on the imaginary numberline - } - } - - // calculate values - double[][] values = new double[width][height]; // new array of booleans for the drawing - for (int i = 0; i < width; i++) { - for (int j = 0; j < height; j++) { - values[i][j] = checkMandelbrot(coords[i][j], iterations, threshold); // check if the number is inside of th set - } - - } - - if (imageMode) { - - createImage(image, frameCounter, f, width, height, values); - - } else { - // draw - draw(low, HIGH, width, height, values); - } - - System.out.println("------------------------Frame " + frameCounter + " finished------------------------"); - - zoom *= zoomSpeed; - } - - // TIME - long endtime = System.currentTimeMillis(); - long completionTimeLong = endtime - startTime; - double completionTimeSec = (double) completionTimeLong / 1000.0; - System.out.println("Calculated " + frames + " frame/s. Process took " + completionTimeSec + "s"); - - } - - static void draw(char low, char HIGH, int width, int height, double[][] values) { - // a method to draw a filled rectangle of size width * height - // each cell can be low or HIGH, and it will show the corresponding char in each cell - String line; - - for (int i = 0; i < height; i++) { - line = ""; - // for every line: - for (int j = 0; j < width; j++) { - // for every char: - double value = values[j][i]; - if (value >= 1) { - line += HIGH; - } else { - line += low; - } - } - - System.out.println(line); - } - } - - static double checkMandelbrot(CNumber number, int iterations, double threshold) { - - // start - CNumber n = new CNumber(); - CNumber c = number; - - // first - n = CNumber.add(n, c); - - for (int i = 0; i < iterations; i++) { - n = CNumber.add(CNumber.multiply(n, n), c); // CNumber.multiply(n, n) - } - - // System.out.println(n.real + " " + n.imag); - - if (n.real < threshold && n.imag < threshold) { - return 1; - } else { - return 0; - } - - - } - - static void createImage(BufferedImage image, int counter, File f, int width, int height, double[][] values) { - - - System.out.println("Frame: " + counter + " | Started creating image..."); - - - - int p0 = getColorAsInt(0, 0, 0, 0); - int p1 = getColorAsInt(0, 50, 50, 50); - int p2 = getColorAsInt(0, 100, 100, 100); - int p3 = getColorAsInt(0, 150, 150, 150); - int p4 = getColorAsInt(0, 200, 200, 200); - int pMax = getColorAsInt(0, 255, 255, 255); - - int threshold1 = 10; - int threshold2 = 20; - - for (int i = 0; i < width; i++) { - for (int j = 0; j < height; j++) { - if (values[i][j] >= 1) { - image.setRGB(i, j, p0); - } else { - image.setRGB(i, j, pMax); - } - } - } - - try { - f = new File("sequence\\Sequence" + counter + ".png"); - ImageIO.write(image, "png", f); - System.out.println(f.getAbsolutePath()); - } catch (IOException e) { - System.out.println(e); - } - - System.out.println("Frame: " + counter + " | Finished creating image."); - } - - public static int getColorAsInt(int a, int r, int g, int b) { - - int p1 = (a << 24) | (r << 16) | (g << 8) | b; - - return p1; - } - -} - -// ^ originaler italienischer spaghetti code ^ \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index e07544a..9582322 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,29 +1,26 @@ -use std::error::Error; -use std::time::{SystemTime, Duration}; -use std::ops::{Add, Mul}; use std::env::Args; +use std::error::Error; use std::fmt::{Display, Formatter}; -use image::{RgbImage, ImageBuffer, ImageResult}; use std::io::{self, Write}; +use std::ops::{Add, Mul}; +use std::time::{Duration, SystemTime}; + +use image::{ImageBuffer, Rgb, RgbImage}; pub fn run(config: Config) -> Result<(), Box> { let start_time = SystemTime::now(); let debug = config.debug; - let result = check_whole_mandelbrot(&config); - - if debug { println!("calculated after: {}", format_time(start_time.elapsed()?)); } - if config.is_image { - create_image(&result, config.iterations, "img.png")?; - if debug { println!("image created after: {}", format_time(start_time.elapsed()?)); } - } - if config.is_console { + check_whole_mandelbrot_img_single_pass(&config)?; + } else { + let result = check_whole_mandelbrot(&config); let draw = draw(&result, config.iterations); println!("{}", draw); - if debug { println!("drawn after: {}", format_time(start_time.elapsed()?)); } } + if debug { println!("calculated in: {}", format_time(start_time.elapsed()?)); } + if debug { println!("Total Time: {}", format_time(start_time.elapsed()?)); } Ok(()) } @@ -88,15 +85,57 @@ fn check_mandelbrot(x: usize, y: usize, config: &Config, offset: &CNumber, step_ config.iterations } -static HIGH: &str = "#"; -static LOW: &str = " "; +fn check_whole_mandelbrot_img_single_pass(config: &Config) -> Result<(), Box> { + let height = config.width * 2.0 / 3.0; + + let mut image: RgbImage = ImageBuffer::new(config.width as u32, height as u32); + + let step_size = CNumber { + real: 3.0 / config.width, + imag: 2.0 / height, + }; + let offset = CNumber { + real: config.center.real - config.width / 2.0 * step_size.real, + imag: -(config.center.imag - height / 2.0 * step_size.imag) - 2.0, + }; + + + for i in 0..height as usize { + for j in 0..config.width as usize { + let value = check_mandelbrot(j, i, config, &offset, &step_size); + *image.get_pixel_mut(j as u32, i as u32) = get_color_for_pixel(value, config.iterations) + } + + if config.debug { + let progress = i as f64 / height; + print!("\r{:.2}% {}", progress * 100.0, progress_bar(progress)); + let _ = io::stdout().flush(); + } + } + + if config.debug { + println!("\r100.00% {}", progress_bar(1.0)); + } + + image.save(&config.image_path)?; + + Ok(()) +} + +fn get_color_for_pixel(value: u32, iter: u32) -> Rgb { + if value < iter { + image::Rgb([255, 255, 255]) + } else { + image::Rgb([0, 0, 0]) + } +} fn draw(values: &Vec>, iterations: u32) -> String { let mut out = String::new(); for line in values { for char in line { - out += if char < &iterations { LOW } else { HIGH }; + out += if char < &iterations { " " } else { "#" }; } out += "\n"; } @@ -104,22 +143,6 @@ fn draw(values: &Vec>, iterations: u32) -> String { out } -fn create_image(values: &Vec>, iterations: u32, path: &str) -> ImageResult<()> { - let w = values[0].len() as u32; - let h = values.len() as u32; - - let mut image: RgbImage = ImageBuffer::new(w as u32, h as u32); - - for y in 0..h { - for x in 0..w { - let val = values[y as usize][x as usize]; - *image.get_pixel_mut(x, y) = if val < iterations { image::Rgb([255, 255, 255]) } else { image::Rgb([0, 0, 0]) }; - } - } - - image.save(path) -} - static BAR_SIZE: usize = 50; fn progress_bar(progress: f64) -> String { @@ -135,31 +158,34 @@ fn progress_bar(progress: f64) -> String { fn format_time(d: Duration) -> String { if d.as_micros() < 10 { - format!("{}ns", d.as_nanos()) - } else if d.as_millis() < 10 { - format!("{}μs", d.as_micros()) - } else if d.as_secs() < 10 { - format!("{}ms", d.as_millis()) - } else { - let secs = d.as_secs(); - - if secs < 60 { - format!("{}s", secs) - } else { - let mins = secs / 60; - let secs = secs % 60; - - if mins < 60 { - format!("{}m {}s", mins, secs) - } else { - let hours = mins / 60; - let mins = mins % 60; - format!("{}h {}m {}s", hours, mins, secs) - } - } + return format!("{}ns", d.as_nanos()); } + if d.as_millis() < 10 { + return format!("{}μs", d.as_micros()); + } + if d.as_secs() < 10 { + return format!("{}ms", d.as_millis()); + } + + let ms = d.as_millis() % 1000; + let secs = d.as_secs(); + + if secs < 60 { + return format!("{}s {}ms", secs, ms); + } + + let mins = secs / 60; + let secs = secs % 60; + + if mins < 60 { + return format!("{}m {}s {}ms", mins, secs, ms); + } + let hours = mins / 60; + let mins = mins % 60; + format!("{}h {}m {}s {}ms", hours, mins, secs, ms) } + #[derive(Copy, Clone, Debug, PartialEq)] struct CNumber { real: f64, @@ -202,7 +228,6 @@ pub struct Config { center: CNumber, iterations: u32, is_image: bool, - is_console: bool, image_path: String, debug: bool, } @@ -222,10 +247,6 @@ impl Config { }; } - if !config.is_image { - config.is_console = true; - } - Ok(config) } @@ -265,8 +286,6 @@ impl Config { match key { Some("img") | Some("image") => self.is_image = true, - Some("console") | Some("cli") => - self.is_console = true, Some("debug") | Some("dbg") => self.debug = true, _ => return Err(Box::new(PropertyError { msg: format!("Property not found: {}", key.unwrap_or_else(|| "")) })) @@ -277,10 +296,10 @@ impl Config { pub fn default() -> Config { - Config::new(1, 3, 100, 100.0, false, String::from("img.png"), false, false) + Config::new(1, 3, 100, 100.0, false, String::from("img.png"), false) } - pub fn new(point_number: usize, quality: i32, width: i32, threshold: f32, is_image: bool, image_path: String, is_console: bool, debug: bool) -> Config { + pub fn new(point_number: usize, quality: i32, width: i32, threshold: f32, is_image: bool, image_path: String, debug: bool) -> Config { let interesting_points = vec![CNumber::new(-0.75, 0.0), CNumber::new(-0.77568377, 0.13646737)]; let center = interesting_points[point_number]; let iterations = config_iter_from_quality(quality); @@ -291,7 +310,6 @@ impl Config { iterations, threshold: threshold as f64, is_image, - is_console, image_path, debug, } @@ -324,7 +342,7 @@ impl Error for PropertyError {} #[cfg(tests)] mod tests { - use crate::{CNumber, calculate_sample_points, check_mandelbrot, draw, HIGH, LOW, Config}; + use crate::{calculate_sample_points, check_mandelbrot, CNumber, Config, draw, HIGH, LOW}; #[test] fn cnumber_add_test() {