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}