research-connectivity.rs

2.1 kB · rust · 69 lines

1use mrlycore::errors::Result;2use mrlycore::Color;3use mrlycore::Rng;4use mrlyfig::board::{Board, Frame};5use mrlyfig::{ink, save, Grid};6use mrlymath::two::designs;78const SIDE: usize = 64;9const CELLS: usize = 729;1011fn scatter(seed: u64, count: usize) -> Vec<bool> {12    let mut rng = Rng::new(seed);13    let mut slots: Vec<usize> = (0..SIDE * SIDE).collect();14    let mut mask = vec![false; SIDE * SIDE];15    for pick in 0..count {16        let swap = pick + rng.below(slots.len() - pick);17        slots.swap(pick, swap);18        mask[slots[pick]] = true;19    }20    assert_eq!(mask.iter().filter(|on| **on).count(), count);21    mask22}2324fn plate(board: &mut Board, frame: Frame, mask: &[bool], color: Color, rule: f64) {25    let edge = frame.inset(-rule * 2.0);26    board.rect(edge.x, edge.y, edge.w, rule, ink::line());27    board.rect(edge.x, edge.y + edge.h - rule, edge.w, rule, ink::line());28    board.rect(edge.x, edge.y, rule, edge.h, ink::line());29    board.rect(edge.x + edge.w - rule, edge.y, rule, edge.h, ink::line());30    let grid = Grid::new(frame, SIDE, SIDE, 0.0);31    for row in 0..SIDE {32        for col in 0..SIDE {33            if mask[row * SIDE + col] {34                grid.fill(board, col, row, color);35            }36        }37    }38}3940fn main() -> Result<()> {41    let mut board = Board::square();42    let rule = board.width as f64 / 320.0;43    let lay = board.frame(0.08).inset(rule * 2.0);44    let gap = rule * 4.0;45    let side = (lay.w - gap) / 2.0;4647    let cells = designs::create(7, 2, 6, 0, 2)?;48    assert_eq!(cells.width(), SIDE);49    let types = cells.types();50    let gasket: Vec<bool> = (0..SIDE * SIDE).map(|flat| types.at(flat) != 0).collect();51    assert_eq!(gasket.iter().filter(|on| **on).count(), CELLS);5253    plate(54        &mut board,55        Frame::new(lay.x, lay.y, side, side),56        &gasket,57        ink::green(),58        rule,59    );60    plate(61        &mut board,62        Frame::new(lay.x + side + gap, lay.y + side + gap, side, side),63        &scatter(20260902, CELLS),64        ink::pink(),65        rule,66    );67    save("research-connectivity", &board)?;68    Ok(())69}