wiki-leibniz-series.rs
1.7 kB · rust · 52 lines
1use mrlycore::errors::Result;2use mrlyfig::{ink, plot, save, Board, Frame};34const TERMS: usize = 30;56fn dashed(board: &mut Board, frame: Frame, y: f64) {7 let step = frame.w / 48.0;8 let mut x = frame.x;9 while x < frame.x + frame.w {10 let to = (x + step * 0.55).min(frame.x + frame.w);11 board.segment((x, y), (to, y), 2.5, ink::dim());12 x += step;13 }14}1516fn main() -> Result<()> {17 let mut board = Board::square();18 let frame = board.frame(0.08);19 let limit = std::f64::consts::PI / 4.0;20 let mut walk = Vec::with_capacity(TERMS);21 let mut run = 0.0;22 for k in 0..TERMS {23 run += if k % 2 == 0 { 1.0 } else { -1.0 } / (2 * k + 1) as f64;24 walk.push(run);25 }26 let lo = walk.iter().copied().fold(f64::MAX, f64::min) - 0.05;27 let hi = walk.iter().copied().fold(f64::MIN, f64::max) + 0.05;28 let slot = frame.w / TERMS as f64;29 let up = |v: f64| frame.y + frame.h * (1.0 - (v - lo) / (hi - lo));30 let at = |i: usize| (frame.x + (i as f64 + 0.5) * slot, up(walk[i]));31 let pts: Vec<(f64, f64)> = (0..TERMS).map(at).collect();32 plot::axis(&mut board, frame, ink::line());33 dashed(&mut board, frame, up(limit));34 board.polyline(&pts, 2.0, ink::line());35 let mut over = 0usize;36 let mut under = 0usize;37 for (i, point) in pts.iter().enumerate() {38 let high = walk[i] > limit;39 board.disc(40 point.0,41 point.1,42 slot * 0.34,43 if high { ink::blue() } else { ink::orange() },44 );45 over += high as usize;46 under += !high as usize;47 }48 assert_eq!(over, 15);49 assert_eq!(under, 15);50 save("wiki-leibniz-series", &board)?;51 Ok(())52}