research-dilations.rs
1.7 kB · rust · 59 lines
1use figures::{ink, save, Board};2use mrlyrs::core::error::Result;34const LEVEL: usize = 4;5const LAGS: usize = 31;6const PEAK: u64 = 5;7const MARGIN: f64 = 0.08;8const FILL: f64 = 0.46;910fn main() -> Result<()> {11 let field = stern_field(LEVEL);12 assert_eq!(field.len(), LAGS);13 assert_eq!(field.iter().sum::<u64>(), 81);14 assert_eq!(field.iter().max(), Some(&PEAK));15 let peaks: Vec<usize> = (0..LAGS).filter(|&n| field[n] == PEAK).collect();16 assert_eq!(peaks, vec![10, 12, 18, 20]);17 assert_eq!(field.iter().filter(|&&r| r == 1).count(), 2 * LEVEL + 1);1819 let mut board = Board::square();20 let frame = board.frame(MARGIN);21 let cell = frame.w / LAGS as f64;22 let top = cell * FILL;23 let mut marked = 0usize;24 for m in 0..LAGS {25 for n in 0..LAGS {26 let count = field[m] * field[n];27 let r = top * (count as f64 / (PEAK * PEAK) as f64).sqrt();28 let (x, y) = (29 frame.x + (n as f64 + 0.5) * cell,30 frame.y + (m as f64 + 0.5) * cell,31 );32 let color = if count == PEAK * PEAK {33 marked += 1;34 ink::yellow()35 } else {36 ink::blue()37 };38 board.disc(x, y, r, color);39 }40 }41 assert_eq!(marked, 16);42 save("research-dilations", &board)?;43 Ok(())44}4546fn stern_field(level: usize) -> Vec<u64> {47 let mut r = vec![1u64];48 for j in 0..level {49 let s = 1usize << j;50 let mut out = vec![0u64; r.len() + 2 * s];51 for (n, &v) in r.iter().enumerate() {52 for k in 0..3 {53 out[n + k * s] += v;54 }55 }56 r = out;57 }58 r59}