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}