demo-sequences.rs
2.3 kB · rust · 66 lines
1use mrlycore::errors::Result;2use mrlyfig::{ink, save, Board};3use mrlylab::ledger::{designs, terms, Axis, Key, Measure, BUDGET};4use mrlynum::blend::delta;56const COUNT: usize = 8;78fn main() -> Result<()> {9 assert_eq!(designs(1, 2)?.len(), 3);10 assert_eq!(designs(2, 2)?.len(), 6);11 assert_eq!(designs(3, 2)?.len(), 22);12 let mut rows: Vec<(usize, Vec<i128>)> = Vec::new();13 for dimension in 1..=3usize {14 for &code in designs(dimension, 2)? {15 let key = Key::new(code, dimension, 2, Measure::Fills, Axis::Side);16 let (values, capped) = terms(&key, COUNT, BUDGET)?;17 assert!(!capped);18 let mut fold = values.clone();19 for _ in 0..dimension {20 fold = delta(&fold);21 }22 assert!(fold.iter().all(|value| *value == fold[0]));23 assert!(delta(&fold).iter().all(|value| *value == 0));24 if values[0] > 0 {25 rows.push((dimension, values));26 }27 }28 }29 assert_eq!(rows.len(), 28);3031 let mut board = Board::square();32 let frame = board.frame(0.08);33 let sides: Vec<f64> = (0..COUNT).map(|i| ((2 * i + 3) as f64).ln()).collect();34 let logs: Vec<f64> = rows35 .iter()36 .flat_map(|(_, values)| values.iter().map(|value| (*value as f64).ln()))37 .collect();38 let low = logs.iter().copied().fold(f64::MAX, f64::min);39 let high = logs.iter().copied().fold(f64::MIN, f64::max);40 let at = |index: usize, value: i128| {41 (42 frame.x + frame.w * (sides[index] - sides[0]) / (sides[COUNT - 1] - sides[0]),43 frame.y + frame.h * (1.0 - ((value as f64).ln() - low) / (high - low)),44 )45 };46 for dimension in 1..=3usize {47 let color = match dimension {48 1 => ink::fade(ink::dim(), 0.85),49 2 => ink::yellow(),50 _ => ink::blue(),51 };52 for (_, values) in rows.iter().filter(|(d, _)| *d == dimension) {53 let path: Vec<(f64, f64)> = values54 .iter()55 .enumerate()56 .map(|(index, value)| at(index, *value))57 .collect();58 board.polyline(&path, 2.5, color);59 for (x, y) in &path {60 board.disc(*x, *y, 5.5, color);61 }62 }63 }64 save("demo-sequences", &board)?;65 Ok(())66}