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}