use plotters::coord::Shift; use plotters::prelude::*; pub fn sierpinski_carpet( depth: u32, drawing_area: &DrawingArea, ) -> Result<(), Box> { if depth > 0 { let sub_areas = drawing_area.split_evenly((3, 3)); for (idx, sub_area) in (0..).zip(sub_areas.iter()) { if idx != 4 { sub_area.fill(&BLUE)?; sierpinski_carpet(depth - 1, sub_area)?; } else { sub_area.fill(&WHITE)?; } } } Ok(()) } const OUT_FILE_NAME: &str = "plotters-doc-data/sierpinski.png"; fn main() -> Result<(), Box> { let root = BitMapBackend::new(OUT_FILE_NAME, (1024, 768)).into_drawing_area(); root.fill(&WHITE)?; let root = root .titled("Sierpinski Carpet Demo", ("sans-serif", 60))? .shrink(((1024 - 700) / 2, 0), (700, 700)); sierpinski_carpet(5, &root)?; // To avoid the IO failure being ignored silently, we manually call the present function root.present().expect("Unable to write result to file, please make sure 'plotters-doc-data' dir exists under current dir"); println!("Result has been saved to {}", OUT_FILE_NAME); Ok(()) } #[test] fn entry_point() { main().unwrap() }