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}