demo-slices.rs

1.9 kB · rust · 64 lines

1use mrlycore::errors::Result;2use mrlyfig::board::{Board, Frame};3use mrlyfig::{hex, ink, save};4use mrlymath::six;5use mrlymath::six::Cell6d;67const CODE: u128 = 23;8const WIDE: usize = 4;910fn at(cell: &Cell6d, side: usize, row: usize, col: usize) -> u8 {11    let offset = (cell.width() - hex::row_len(side, row)) / 2;12    cell.cell.types().get(&[row, col + offset])13}1415fn panels(frame: Frame, gap: f64) -> Vec<Frame> {16    frame17        .rows(WIDE)18        .iter()19        .flat_map(|row| row.cols(WIDE))20        .map(|cell| cell.inset(gap))21        .collect()22}2324fn main() -> Result<()> {25    let mut board = Board::square();26    let frame = board.frame(0.08);27    let stage = panels(frame, frame.w / WIDE as f64 * 0.05);28    let mut triangles = 0usize;29    for k in 1..=WIDE * WIDE {30        let side = 2 * k - 1;31        let slice = six::cut_design(CODE, side, 1, 2)?;32        let pieces = six::components(&slice)?;33        let holes = six::holes(&slice)?;34        if k % 2 == 0 {35            assert_eq!(pieces, 1);36            assert!(holes > 0);37        } else if k > 1 {38            assert!(pieces > 1);39        }40        let color = if pieces > 1 {41            ink::blue()42        } else {43            ink::orange()44        };45        let panel = stage[k - 1];46        let edge = panel.w / (2 * side) as f64;47        let painted = std::cell::Cell::new(0usize);48        let offered = std::cell::Cell::new(0usize);49        hex::hexagon(&mut board, panel, side, edge * 0.14, |row, col, _| {50            offered.set(offered.get() + 1);51            if at(&slice, side, row, col) != six::FILL {52                return None;53            }54            painted.set(painted.get() + 1);55            Some(color)56        });57        assert_eq!(offered.get(), hex::count(side));58        assert_eq!(painted.get(), six::fills(&slice));59        triangles += offered.get();60    }61    assert_eq!(triangles, 32736);62    save("demo-slices", &board)?;63    Ok(())64}