research-farey.rs
1.2 kB · rust · 45 lines
1use mrlycore::errors::Result;2use mrlyfig::board::Board;3use mrlyfig::ink::Ramp;4use mrlyfig::{ink, save};5use mrlynum::factor::lcm;6use mrlynum::lattice;78const ORDER: usize = 60;910fn main() -> Result<()> {11 let nodes = lattice::farey(ORDER);12 assert_eq!(nodes.len(), 1103);13 let mut stack: Vec<(f64, f64, usize)> = Vec::new();14 for across in &nodes {15 for down in &nodes {16 let grid = lcm(across.den as usize, down.den as usize);17 if grid > ORDER {18 continue;19 }20 stack.push((21 across.num as f64 / across.den as f64,22 down.num as f64 / down.den as f64,23 ORDER / grid,24 ));25 }26 }27 assert_eq!(stack.len(), 63261);28 stack.sort_by_key(|node| node.2);2930 let ramp = Ramp::new(vec![ink::ground(), ink::blue(), ink::yellow()]);31 let mut board = Board::square();32 let frame = board.frame(0.08);33 for (x, y, weight) in stack {34 let share = weight as f64 / ORDER as f64;35 let (px, py) = frame.at(x, 1.0 - y);36 board.disc(37 px,38 py,39 1.0 + 3.0 * share.powf(0.7),40 ramp.at(share.powf(0.30)),41 );42 }43 save("research-farey", &board)?;44 Ok(())45}