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}