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}