wiki-cellular-automaton.rs

1.3 kB · rust · 45 lines

1use mrlycore::errors::Result;2use mrlyfig::{ink, save, Board};3use mrlymath::life::elementary;45const RULE: u8 = 90;6const STEPS: usize = 63;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 live = 0usize;17    for t in 0..rows {18        for c in 0..window {19            if diagram.at(t * window + c) != 0 {20                live += 1;21            }22        }23    }24    assert_eq!(live, 729);2526    let scale = (area.w / window as f64).min(area.h / rows as f64);27    let ox = (board.width as f64 - window as f64 * scale) / 2.0;28    let oy = (board.height as f64 - rows as f64 * scale) / 2.0;29    let gap = scale * 0.12;30    for t in 0..rows {31        for c in 0..window {32            if diagram.at(t * window + c) != 0 {33                board.rect(34                    ox + c as f64 * scale + gap,35                    oy + t as f64 * scale + gap,36                    scale - 2.0 * gap,37                    scale - 2.0 * gap,38                    ink::yellow(),39                );40            }41        }42    }43    save("wiki-cellular-automaton", &board)?;44    Ok(())45}