wiki-eisenstein-integers.rs

1.3 kB · rust · 42 lines

1use mrlycore::errors::Result;2use mrlyfig::{ink, save, Board};3use mrlynum::gauss::{Ring, Window};45const REACH: u64 = 8;6const POINTS: usize = 217;78fn main() -> Result<()> {9    let mut board = Board::square();10    let frame = board.frame(0.07);11    let ring = Ring::Eisenstein;12    let window = Window::new(ring, REACH);13    let points = window.points();14    assert_eq!(points.len(), POINTS);15    let units = ring.associates(1, 0);16    assert_eq!(units.len(), 6);17    let scale = frame.w / (2 * REACH + 1) as f64;18    let (cx, cy) = frame.center();19    let place = |a: i64, b: i64| {20        let (x, y) = ring.place(a, b);21        (cx + x * scale, cy - y * scale)22    };23    for &(a, b) in &points {24        for &(da, db) in &units[..3] {25            if window.holds(a + da, b + db) {26                board.segment(place(a, b), place(a + da, b + db), 1.2, ink::line());27            }28        }29    }30    for &(a, b) in &points {31        let (x, y) = place(a, b);32        board.disc(x, y, scale * 0.16, ink::blue());33    }34    for &(a, b) in &units {35        let (x, y) = place(a, b);36        board.disc(x, y, scale * 0.3, ink::yellow());37    }38    let (x, y) = place(0, 0);39    board.disc(x, y, scale * 0.34, ink::orange());40    save("wiki-eisenstein-integers", &board)?;41    Ok(())42}