paper-slice-sign-even-half.rs

1.7 kB · rust · 59 lines

1use mrlycore::errors::Result;2use mrlyfig::{ink, save, Board};34const THREE: [usize; 20] = [5    0, 1, 2, 4, 6, 8, 11, 14, 18, 22, 27, 32, 38, 44, 50, 57, 64, 72, 81, 89,6];7const OTHERS: [[usize; 3]; 4] = [[5, 4, 16], [7, 4, 26], [9, 4, 0], [11, 4, 0]];89fn depth(first: usize, second: usize, dim: usize) -> f64 {10    if second > 0 && dim >= second {11        2.012    } else if dim >= first {13        1.014    } else {15        0.016    }17}1819fn main() -> Result<()> {20    let mut board = Board::square();21    let frame = board.frame(0.08);22    let peak = *THREE.last().unwrap() as f64;23    assert_eq!(THREE.len(), 20);24    assert_eq!(peak, 89.0);25    let at = |dim: f64, depth: f64| {26        (27            frame.x + frame.w * (dim - 2.0) / 38.0,28            frame.y + frame.h * (1.0 - depth / peak),29        )30    };31    board.rect(frame.x, frame.y + frame.h, frame.w, 2.0, ink::line());3233    for (order, row) in OTHERS.iter().enumerate() {34        let mut steps = Vec::new();35        for index in 0..THREE.len() {36            let dim = 2.0 + 2.0 * index as f64;37            let value = depth(row[1], row[2], dim as usize);38            steps.push(at(dim, value));39            steps.push(at((dim + 2.0).min(40.0), value));40        }41        board.polyline(42            &steps,43            3.0,44            ink::fade(ink::dim(), 0.95 - 0.1 * order as f64),45        );46    }4748    let curve: Vec<(f64, f64)> = THREE49        .iter()50        .enumerate()51        .map(|(index, k)| at(2.0 + 2.0 * index as f64, *k as f64))52        .collect();53    board.polyline(&curve, 3.0, ink::orange());54    for point in &curve {55        board.disc(point.0, point.1, 8.0, ink::orange());56    }57    save("paper-slice-sign-even-half", &board)?;58    Ok(())59}