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}