demo-spectrometer.rs
1.9 kB · rust · 56 lines
1use mrlycore::errors::Result;2use mrlyfig::board::{Board, Frame};3use mrlyfig::{hex, ink, save};4use mrlymath::six;5use mrlymath::six::Cell6d;67const CODES: [u128; 9] = [0, 1, 3, 7, 23, 31, 63, 127, 255];8const SIDE: usize = 11;9const WIDE: usize = 3;1011fn at(cell: &Cell6d, row: usize, col: usize) -> u8 {12 let offset = (cell.width() - hex::row_len(SIDE, row)) / 2;13 cell.cell.types().get(&[row, col + offset])14}1516fn panels(frame: Frame, gap: f64) -> Vec<Frame> {17 frame18 .rows(WIDE)19 .iter()20 .flat_map(|row| row.cols(WIDE))21 .map(|cell| cell.inset(gap))22 .collect()23}2425fn main() -> Result<()> {26 let mut board = Board::square();27 let frame = board.frame(0.08);28 let stage = panels(frame, frame.w / WIDE as f64 * 0.05);29 let mut ink_total = 0usize;30 let mut last = 0usize;31 for (corners, code) in CODES.iter().enumerate() {32 assert_eq!(code.count_ones() as usize, corners);33 if corners > 0 {34 assert_eq!(code & CODES[corners - 1], CODES[corners - 1]);35 }36 let slice = six::cut_design(*code, SIDE, 1, 2)?;37 let fills = six::fills(&slice);38 assert!(fills >= last);39 last = fills;40 ink_total += fills;41 let panel = stage[corners];42 let edge = panel.w / (2 * SIDE) as f64;43 hex::hexagon(&mut board, panel, SIDE, 0.0, |_, _, _| Some(ink::line()));44 hex::hexagon(&mut board, panel, SIDE, edge * 0.06, |row, col, _| {45 (at(&slice, row, col) != six::FILL).then(ink::ground)46 });47 hex::hexagon(&mut board, panel, SIDE, edge * 0.06, |row, col, _| {48 (at(&slice, row, col) == six::FILL).then(ink::blue)49 });50 }51 assert_eq!(hex::count(SIDE), 726);52 assert_eq!(six::fills(&six::cut_design(CODES[8], SIDE, 1, 2)?), 726);53 assert!(ink_total > 0);54 save("demo-spectrometer", &board)?;55 Ok(())56}