demo-wolfram.rs
1.4 kB · rust · 50 lines
1use mrlycore::errors::Result;2use mrlyfig::{ink, save, Board};3use mrlymath::life::elementary;45const RULE: u8 = 110;6const STEPS: usize = 256;78fn main() -> Result<()> {9 let mut board = Board::square();10 let area = board.frame(0.08);11 let rows = STEPS + 1;12 let window = 2 * STEPS + 1;13 let diagram = elementary::single_seed(RULE, STEPS);14 assert_eq!(diagram.shape, vec![rows, window]);1516 let mut lo = window;17 let mut hi = 0usize;18 let mut live = 0usize;19 for t in 0..rows {20 for c in 0..window {21 if diagram.at(t * window + c) != 0 {22 lo = lo.min(c);23 hi = hi.max(c);24 live += 1;25 }26 }27 }28 assert_eq!(lo, 0);29 assert_eq!(hi, STEPS);30 assert!(live > 0);3132 let span = hi - lo + 1;33 let scale = (area.w / span as f64)34 .min(area.h / rows as f64)35 .floor()36 .max(1.0);37 let ox = ((board.width as f64 - span as f64 * scale) / 2.0).round();38 let oy = ((board.height as f64 - rows as f64 * scale) / 2.0).round();39 for t in 0..rows {40 for c in lo..=hi {41 if diagram.at(t * window + c) != 0 {42 let x = ox + (c - lo) as f64 * scale;43 let y = oy + t as f64 * scale;44 board.rect(x, y, scale, scale, ink::fg());45 }46 }47 }48 save("demo-wolfram", &board)?;49 Ok(())50}