demo-moire.rs
1.8 kB · rust · 57 lines
1use mrlycore::errors::Result;2use mrlyfig::board::{Board, Frame};3use mrlyfig::ink::Ramp;4use mrlyfig::{field, ink, save};5use mrlylab::moire::presets::{self, Preset};6use mrlylab::moire::sample;78const LIMIT: usize = 9;9const LAYERS: usize = 5;10const PANEL: usize = 420;11const GUTTER: f64 = 20.0;1213fn values(preset: &Preset) -> Result<Vec<f64>> {14 let sheet = preset.field(PANEL)?;15 assert_eq!(sheet.data.len(), PANEL * PANEL);16 Ok(sheet.as_f64())17}1819fn main() -> Result<()> {20 let recipes = presets::all(LIMIT);21 assert_eq!(recipes.len(), 4);22 for recipe in &recipes {23 assert_eq!(recipe.numbers, vec![1, 3, 5, 7, 9]);24 assert_eq!(recipe.numbers.len(), LAYERS);25 }26 let table = sample::membership(recipes[3].spec.code, 3, 2)?;27 assert_eq!(table.iter().filter(|&&lit| lit).count(), 8);28 assert!(!table[sample::pack(&[1, 1], 3)]);2930 let sheets = recipes31 .iter()32 .map(values)33 .collect::<Result<Vec<Vec<f64>>>>()?;34 let woven = &sheets[1];35 assert!(woven.iter().all(|&v| v == 0.0 || v == 1.0));36 for counted in [&sheets[0], &sheets[2], &sheets[3]] {37 let high = counted.iter().copied().fold(f64::MIN, f64::max);38 assert_eq!(high, LAYERS as f64);39 }4041 let ramp = Ramp::new(vec![42 ink::mix(ink::ground(), ink::blue(), 0.38),43 ink::blue(),44 ink::yellow(),45 ]);46 let mut board = Board::square();47 let side = 2.0 * PANEL as f64 + GUTTER;48 let edge = (board.width as f64 - side) / 2.0;49 for (index, sheet) in sheets.iter().enumerate() {50 let x = edge + (index % 2) as f64 * (PANEL as f64 + GUTTER);51 let y = edge + (index / 2) as f64 * (PANEL as f64 + GUTTER);52 let frame = Frame::new(x, y, PANEL as f64, PANEL as f64);53 field::draw(&mut board, frame, PANEL, PANEL, sheet, &ramp);54 }55 save("demo-moire", &board)?;56 Ok(())57}