wiki-wallis-product.rs

1.4 kB · rust · 48 lines

1use mrlycore::errors::Result;2use mrlyfig::{ink, plot, save, Board, Frame};34const TERMS: usize = 40;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 / 2.0;20    let mut walk = Vec::with_capacity(TERMS);21    let mut run = 1.0;22    for k in 1..=TERMS {23        let k = k as f64;24        run *= 4.0 * k * k / (4.0 * k * k - 1.0);25        walk.push(run);26    }27    let lo = walk[0] - 0.06;28    let hi = limit + 0.04;29    let foot = frame.y + frame.h;30    let up = |v: f64| foot - frame.h * (v - lo) / (hi - lo);31    let slot = frame.w / TERMS as f64;32    let pad = slot * 0.16;33    for (i, value) in walk.iter().enumerate() {34        let y = up(*value);35        board.rect(36            frame.x + i as f64 * slot + pad,37            y,38            slot - 2.0 * pad,39            foot - y,40            ink::blue(),41        );42    }43    dashed(&mut board, frame, up(limit));44    plot::axis(&mut board, frame, ink::line());45    assert_eq!(walk.iter().filter(|value| **value < limit).count(), TERMS);46    save("wiki-wallis-product", &board)?;47    Ok(())48}