demo-tower.rs

1.6 kB · rust · 57 lines

1use mrlycore::colors::{shades, ORANGE};2use mrlycore::errors::Result;3use mrlyfig::board::Frame;4use mrlyfig::{iso, save, Board, Color};5use mrlymath::bang::{magic, MagicLayer};6use mrlymath::name::Bang;7use mrlymath::three::designs;8use mrlymath::three::Cell3d;910const NUMBER: usize = 3;11const SHARE: [f64; 3] = [0.26, 0.33, 0.4];12const WALK: [f64; 3] = [0.2, 0.5, 0.8];1314fn word() -> [MagicLayer; 3] {15    [16        MagicLayer::new(Bang::new(23, 3, 2), NUMBER),17        MagicLayer::new(Bang::new(9, 3, 2), NUMBER),18        MagicLayer::new(Bang::new(23, 3, 2), NUMBER),19    ]20}2122fn block(k: usize) -> Result<Cell3d> {23    let letters = word();24    if k == 1 {25        return designs::create(letters[0].design.code, NUMBER, 1, 2);26    }27    Ok(Cell3d::new(magic(&letters[..k])?))28}2930fn shade() -> [Color; 3] {31    shades(ORANGE)32}3334fn stack(frame: Frame) -> Vec<Frame> {35    let mut out = Vec::new();36    for (share, walk) in SHARE.iter().zip(WALK) {37        let side = frame.w * share;38        let (cx, cy) = (frame.x + frame.w * walk, frame.y + frame.h * walk);39        out.push(Frame::new(cx - side / 2.0, cy - side / 2.0, side, side));40    }41    out42}4344fn main() -> Result<()> {45    let mut board = Board::square();46    let frame = board.frame(0.08);47    let sides = [3usize, 9, 27];48    let counts = [20u64, 200, 4000];49    for (k, panel) in stack(frame).iter().enumerate() {50        let cell = block(k + 1)?;51        assert_eq!(cell.types().shape, vec![sides[k]; 3]);52        assert_eq!(cell.types().sum(), counts[k]);53        iso::draw(&mut board, *panel, &cell, shade(), None);54    }55    save("demo-tower", &board)?;56    Ok(())57}