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}