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}