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}