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}