demo-radial.rs

1.5 kB · rust · 49 lines

1use mrlycore::errors::Result;2use mrlyfig::board::{Board, Frame};3use mrlyfig::ink::Ramp;4use mrlyfig::{field, ink, save};5use mrlymath::two;6use mrlynum::spin;78const LEVEL: usize = 4;9const SIDE: usize = 81;10const COPIES: usize = 6;11const ORDER: usize = 4;12const OUT: usize = 860;13const RINGS: usize = 160;14const ORDERS: usize = 48;15const SAMPLES: usize = 3;1617fn main() -> Result<()> {18    let carpet = two::designs::create(495, 3, LEVEL, 0, 3)?;19    assert_eq!(carpet.width(), SIDE);20    assert_eq!(carpet.types().sum(), 8u64.pow(LEVEL as u32));21    let source: Vec<f32> = carpet.types().bytes().iter().map(|&b| b as f32).collect();22    assert_eq!(source.len(), SIDE * SIDE);2324    let power = spin::harmonics(&source, SIDE, RINGS, ORDERS);25    assert_eq!(spin::turns(&power), ORDER);26    assert_eq!(spin::petals(COPIES, ORDER), 12);2728    let stack = spin::radial(29        &source,30        SIDE,31        OUT,32        COPIES,33        1.0 / COPIES as f64,34        spin::Blend::Mean,35        SAMPLES,36    );37    assert_eq!(stack.len(), OUT * OUT);38    let values: Vec<f64> = stack.iter().map(|&v| v as f64).collect();39    let high = values.iter().copied().fold(f64::MIN, f64::max);40    assert!(high > 0.9);4142    let ramp = Ramp::new(vec![ink::ground(), ink::blue(), ink::yellow()]);43    let mut board = Board::square();44    let edge = (board.width as f64 - OUT as f64) / 2.0;45    let frame = Frame::new(edge, edge, OUT as f64, OUT as f64);46    field::draw_range(&mut board, frame, OUT, OUT, &values, (0.0, high), &ramp);47    save("demo-radial", &board)?;48    Ok(())49}