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}