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}