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}