wiki-eulers-number.rs

1.3 kB · rust · 39 lines

1use mrlycore::errors::Result;2use mrlyfig::{ink, plot, save, Board, Frame};34const TERMS: usize = 60;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::E;20    let walk: Vec<f64> = (1..=TERMS)21        .map(|n| (1.0 + 1.0 / n as f64).powi(n as i32))22        .collect();23    let lo = walk[0] - 0.07;24    let hi = limit + 0.05;25    let slot = frame.w / TERMS as f64;26    let up = |v: f64| frame.y + frame.h * (1.0 - (v - lo) / (hi - lo));27    let pts: Vec<(f64, f64)> = walk28        .iter()29        .enumerate()30        .map(|(i, value)| (frame.x + (i as f64 + 0.5) * slot, up(*value)))31        .collect();32    plot::axis(&mut board, frame, ink::line());33    dashed(&mut board, frame, up(limit));34    board.polyline(&pts, 3.0, ink::blue());35    plot::dots(&mut board, &pts, slot * 0.22, ink::yellow());36    assert_eq!(walk.iter().filter(|value| **value < limit).count(), TERMS);37    save("wiki-eulers-number", &board)?;38    Ok(())39}