| use plotters::coord::Shift; | |
| use plotters::prelude::*; | |
| pub fn sierpinski_carpet( | |
| depth: u32, | |
| drawing_area: &DrawingArea<BitMapBackend, Shift>, | |
| ) -> Result<(), Box<dyn std::error::Error>> { | |
| 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<dyn std::error::Error>> { | |
| 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() | |
| } |