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}