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}