demo-plot.rs
1.7 kB · rust · 47 lines
1use mrlycore::errors::Result;2use mrlyfig::{ink, save, Board};3use mrlylab::ledger::{terms, Axis, Key, Measure, BUDGET};4use mrlynum::blend::delta;56const ROWS: usize = 8;78fn main() -> Result<()> {9 let key = Key::new(23, 3, 2, Measure::Fills, Axis::Side);10 let (first, capped) = terms(&key, ROWS, BUDGET)?;11 assert_eq!(key.name(), "sequence_dim=3_code=23_measure=fills_axis=side");12 assert!(!capped);13 assert_eq!(first, vec![20, 81, 208, 425, 756, 1225, 1856, 2673]);14 let mut rows = vec![first];15 while rows.len() < ROWS {16 rows.push(delta(rows.last().unwrap()));17 }18 let cells: usize = rows.iter().map(|row| row.len()).sum();19 assert_eq!(cells, 36);20 assert_eq!(rows[3], vec![24; 5]);21 assert!(rows[4..].iter().all(|row| row.iter().all(|v| *v == 0)));2223 let mut board = Board::square();24 let frame = board.frame(0.08);25 let step = frame.w / ROWS as f64;26 let top = rows[0].iter().copied().max().unwrap_or(1) as f64;27 let scale = (1.0 + top).ln();28 for (depth, row) in rows.iter().enumerate() {29 let y = frame.y + (depth as f64 + 0.5) * step;30 for (place, value) in row.iter().enumerate() {31 let x = frame.x + (place as f64 + 0.5 + depth as f64 / 2.0) * step;32 if *value == 0 {33 board.ring(x, y, step * 0.14, step * 0.030, ink::dim());34 continue;35 }36 let weight = (1.0 + value.unsigned_abs() as f64).ln() / scale;37 let color = if depth == 3 {38 ink::yellow()39 } else {40 ink::blue()41 };42 board.disc(x, y, step * (0.07 + 0.33 * weight), color);43 }44 }45 save("demo-plot", &board)?;46 Ok(())47}