wiki-basel-problem.rs
2.1 kB · rust · 68 lines
1use mrlycore::errors::Result;2use mrlyfig::{ink, plot, save, Board, Frame};34const SQUARES: usize = 12;5const TERMS: usize = 40;67fn dashed(board: &mut Board, frame: Frame, y: f64) {8 let step = frame.w / 48.0;9 let mut x = frame.x;10 while x < frame.x + frame.w {11 let to = (x + step * 0.55).min(frame.x + frame.w);12 board.segment((x, y), (to, y), 2.5, ink::dim());13 x += step;14 }15}1617fn main() -> Result<()> {18 let mut board = Board::square();19 let frame = board.frame(0.08);20 let top = Frame::new(frame.x, frame.y, frame.w, frame.h * 0.38);21 let chart = Frame::new(22 frame.x,23 frame.y + frame.h * 0.46,24 frame.w,25 frame.h * 0.54,26 );27 let reach: f64 = (1..=SQUARES).map(|k| 1.0 / k as f64).sum();28 let unit = top.w / reach;29 let base = top.y + top.h;30 let mut x = top.x;31 let mut laid = 0usize;32 for k in 1..=SQUARES {33 let side = unit / k as f64;34 board.rect(x, base - side, side - 2.0, side, ink::blue());35 x += side;36 laid += 1;37 }38 plot::baseline(&mut board, Frame::new(top.x, top.y, top.w, base - top.y), ink::line());39 let limit = std::f64::consts::PI * std::f64::consts::PI / 6.0;40 let mut walk = Vec::with_capacity(TERMS);41 let mut run = 0.0;42 for k in 1..=TERMS {43 run += 1.0 / (k * k) as f64;44 walk.push(run);45 }46 let lo = walk[0] - 0.14;47 let hi = limit + 0.12;48 let foot = chart.y + chart.h;49 let up = |v: f64| foot - chart.h * (v - lo) / (hi - lo);50 let slot = chart.w / TERMS as f64;51 let pad = slot * 0.16;52 for (i, value) in walk.iter().enumerate() {53 let y = up(*value);54 board.rect(55 chart.x + i as f64 * slot + pad,56 y,57 slot - 2.0 * pad,58 foot - y,59 ink::yellow(),60 );61 }62 dashed(&mut board, chart, up(limit));63 plot::axis(&mut board, chart, ink::line());64 assert_eq!(laid, SQUARES);65 assert_eq!(walk.iter().filter(|value| **value < limit).count(), TERMS);66 save("wiki-basel-problem", &board)?;67 Ok(())68}