Brownian tree: Difference between revisions

→‎{{header|Rust}}: Update library to rand = "^0.8"
m (→‎{{header|Phix}}: IupCloseOnEscape no longer needed)
(→‎{{header|Rust}}: Update library to rand = "^0.8")
Line 4,126:
 
use image::ColorType;
 
use rand::distributions::{IndependentSample, Range};
use std::cmp::{min, max};
use std::env;
use std::path::Path;
use std::process;
use rand::Rng;
 
fn help() {
Line 4,172 ⟶ 4,173:
width as u32,
height as u32,
ColorType::Gray(8)L8) {
Err(e) => println!("Error writing output image:\n{}", e),
Ok(_) => println!("Output written to:\n{}", output_path.to_str().unwrap()),
Line 4,183 ⟶ 4,184:
let mut field_base: Vec<_> = raw.as_mut_slice().chunks_mut(width).collect();
// Addressable 2d vector
let mut field: &mut [&mut [u8]] = field_base.as_mut_slice();
 
// Seed mote
field[width / 2][height / 2] = 1;
 
let walk_range = Range::new(-1i32, 2i32);
let x_spawn_range = Range::new(1usize, width - 1);
let y_spawn_range = Range::new(1usize, height - 1);
let mut rng = rand::thread_rng();
 
Line 4,198 ⟶ 4,196:
}
 
let x_spawn_rangemut x= Range::newrng.gen_range(1usize, ..width - 1);
// Spawn mote
let mut x y= x_spawn_rangerng.ind_samplegen_range(&mut rng1usize..height-1);
let mut y = y_spawn_range.ind_sample(&mut rng);
 
// Increment field value when motes spawn on top of the structure
Line 4,210 ⟶ 4,207:
loop {
let contacts = field[x - 1][y - 1] + field[x][y - 1] + field[x + 1][y - 1] +
field[x - 1][y] + field[x + 1][y] +
field[x - 1][y + 1] + field[x][y + 1] +
field[x + 1][y + 1];
 
if contacts > 0 {
Line 4,218 ⟶ 4,215:
break;
} else {
let xw = walk_rangerng.ind_samplegen_range(&mut rng-1..2) + x as i32;
let yw = walk_rangerng.ind_samplegen_range(&mut rng-1..2) + y as i32;
if xw < 1 || xw >= (width as i32 - 1) || yw < 1 || yw >= (height as i32 - 1) {
break;
Line 4,229 ⟶ 4,226:
}
}</lang>
For a 512 x 512 field and 65k100k motes, run time is 25around 200 s on ~20112019 hardware (PhenomRyzen II5 X43600X).
<center>[[File:Rust-Brownian-512-20k.png]]</center>
 
Anonymous user