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}