demo-gaussian.rs

1.4 kB · rust · 38 lines

1use mrlycore::errors::Result;2use mrlyfig::{ink, plot, save, Board};3use mrlynum::gauss::{Class, Ring, Window};45const REACH: u64 = 40;67fn main() -> Result<()> {8    let mut board = Board::square();9    let frame = board.frame(0.09);10    let window = Window::new(Ring::Gaussian, REACH);11    let census = window.census();12    assert_eq!(census.points, 6561);13    assert_eq!(census.ramified, 4);14    assert_eq!(census.split + census.inert + census.ramified, census.primes);15    let step = frame.w / (2 * REACH) as f64;16    let (cx, cy) = frame.center();17    let place = |a: i64, b: i64| (cx + a as f64 * step, cy - b as f64 * step);18    let mut split = Vec::new();19    let mut inert = Vec::new();20    let mut ramified = Vec::new();21    for (a, b) in window.points() {22        match window.class(a, b) {23            Class::Split => split.push(place(a, b)),24            Class::Inert => inert.push(place(a, b)),25            Class::Ramified => ramified.push(place(a, b)),26            _ => {}27        }28    }29    assert_eq!(split.len(), census.split);30    assert_eq!(inert.len(), census.inert);31    assert_eq!(ramified.len(), census.ramified);32    let dot = step * 0.36;33    plot::dots(&mut board, &split, dot, ink::blue());34    plot::dots(&mut board, &inert, dot, ink::orange());35    plot::dots(&mut board, &ramified, dot, ink::yellow());36    save("demo-gaussian", &board)?;37    Ok(())38}