research-cuts.rs

2.0 kB · rust · 65 lines

1use mrlycore::errors::Result;2use mrlyfig::board::Board;3use mrlyfig::{ink, plot, save};4use mrlymath::three;56const CODE: u128 = 126;7const LEVEL: usize = 7;8const HEIGHTS: [usize; 2] = [190, 191];9const HALF: usize = 6;1011fn place(point: [u32; 3]) -> (f64, f64) {12    let (u, v) = three::shadow(point);13    (u as f64 / 2f64.sqrt(), v as f64 / 6f64.sqrt())14}1516fn pieces(points: &[[u32; 3]]) -> Vec<usize> {17    let mut tally = vec![0usize; 8];18    for p in points {19        let key = ((p[0] >> HALF) * 4 + (p[1] >> HALF) * 2 + (p[2] >> HALF)) as usize;20        tally[key] += 1;21    }22    tally.retain(|&n| n > 0);23    tally24}2526fn main() -> Result<()> {27    let profile = three::profile(CODE, 2, LEVEL, 2)?;28    let mut cuts = Vec::new();29    for height in HEIGHTS {30        assert_eq!(profile[height], 2187);31        let points = three::diagonal_slice(CODE, 2, LEVEL, 2, height)?;32        assert_eq!(points.len(), 2187);33        assert_eq!(pieces(&points), vec![729, 729, 729]);34        cuts.push(points);35    }3637    let flat: Vec<(f64, f64)> = cuts.iter().flatten().copied().map(place).collect();38    assert_eq!(flat.len(), 4374);39    let mut lo = (f64::MAX, f64::MAX);40    let mut hi = (f64::MIN, f64::MIN);41    for (u, v) in &flat {42        lo.0 = lo.0.min(*u);43        lo.1 = lo.1.min(*v);44        hi.0 = hi.0.max(*u);45        hi.1 = hi.1.max(*v);46    }4748    let mut board = Board::square();49    let frame = board.frame(0.08);50    let span = (hi.0 - lo.0, hi.1 - lo.1);51    let scale = (frame.w / span.0).min(frame.h / span.1);52    let (cx, cy) = frame.center();53    let screen = |(u, v): (f64, f64)| {54        (55            cx + (u - (lo.0 + hi.0) / 2.0) * scale,56            cy - (v - (lo.1 + hi.1) / 2.0) * scale,57        )58    };59    for (cut, color) in cuts.iter().zip([ink::blue(), ink::orange()]) {60        let dots: Vec<(f64, f64)> = cut.iter().copied().map(place).map(screen).collect();61        plot::dots(&mut board, &dots, 2.2, color);62    }63    save("research-cuts", &board)?;64    Ok(())65}