wiki-ford-circles.rs

974 B · rust · 31 lines

1use mrlycore::errors::Result;2use mrlyfig::{ink, save, Board, Ramp};3use mrlynum::factor::gcd;45const ORDER: usize = 8;6const THICK: f64 = 2.6;78fn main() -> Result<()> {9    let mut board = Board::square();10    let frame = board.frame(0.06);11    let ramp = Ramp::tone(ink::blue(), ink::yellow());12    let base = frame.y + frame.h;13    let mut circles = 0usize;14    for b in 1..=ORDER {15        for a in 0..=b {16            if gcd(a, b) != 1 {17                continue;18            }19            let r = frame.w / (2 * b * b) as f64;20            let x = frame.x + frame.w * a as f64 / b as f64;21            let tone = ramp.at((b - 1) as f64 / (ORDER - 1) as f64);22            board.ring(x, base - r, r, THICK, tone);23            board.disc(x, base, THICK * 1.3, tone);24            circles += 1;25        }26    }27    board.segment((frame.x, base), (frame.x + frame.w, base), 1.6, ink::line());28    assert_eq!(circles, 23);29    save("wiki-ford-circles", &board)?;30    Ok(())31}