demo-spin.rs
1.8 kB · rust · 49 lines
1use mrlycore::errors::Result;2use mrlyfig::board::{Board, Frame};3use mrlyfig::ink::Ramp;4use mrlyfig::{field, ink, save};5use mrlymath::six;6use mrlynum::spin;78const PANEL: usize = 430;9const TRIANGLES: usize = 486;10const STEPS: usize = 2048;1112fn main() -> Result<()> {13 let cut = six::cut_design(23, 3, 2, 2)?;14 let tally = six::census(&cut, false);15 assert_eq!(tally.triangles, TRIANGLES);16 assert!(tally.fills > 0 && tally.fills < TRIANGLES);1718 let source = six::raster(&cut, PANEL)?;19 assert_eq!(source.len(), PANEL * PANEL);20 let lit: f64 = source.iter().map(|&v| v as f64).sum();21 assert!(lit > 0.0);2223 let profile = spin::profile(&source, PANEL, STEPS);24 assert_eq!(profile.len(), STEPS);25 let mass = spin::mass(&profile, PANEL);26 assert!((mass - lit).abs() < 0.03 * lit);2728 let reach = profile.iter().rposition(|&v| v > 1e-6).unwrap_or(STEPS - 1);29 assert!(reach > STEPS / 2);30 let rings = spin::wheel(&profile[..=reach], PANEL);31 assert_eq!(rings.len(), PANEL * PANEL);32 let wheel: Vec<f64> = rings.iter().map(|&v| v as f64).collect();33 let peak = wheel.iter().copied().fold(f64::MIN, f64::max);34 assert!(peak > 0.0);3536 let slice: Vec<f64> = source.iter().map(|&v| v as f64).collect();37 let flat = Ramp::tone(ink::ground(), ink::blue());38 let heat = Ramp::new(vec![ink::ground(), ink::blue(), ink::yellow()]);3940 let mut board = Board::square();41 let edge = (board.width as f64 - 2.0 * PANEL as f64) / 2.0;42 let step = PANEL as f64;43 let first = Frame::new(edge, edge, step, step);44 let second = Frame::new(edge + step, edge + step, step, step);45 field::draw_range(&mut board, first, PANEL, PANEL, &slice, (0.0, 1.0), &flat);46 field::draw_range(&mut board, second, PANEL, PANEL, &wheel, (0.0, peak), &heat);47 save("demo-spin", &board)?;48 Ok(())49}