| 1 | use plotters::coord::Shift; |
| 2 | use plotters::prelude::*; |
| 3 | |
| 4 | pub fn sierpinski_carpet( |
| 5 | depth: u32, |
| 6 | drawing_area: &DrawingArea<BitMapBackend, Shift>, |
| 7 | ) -> Result<(), Box<dyn std::error::Error>> { |
| 8 | if depth > 0 { |
| 9 | let sub_areas = drawing_area.split_evenly((3, 3)); |
| 10 | for (idx, sub_area) in (0..).zip(sub_areas.iter()) { |
| 11 | if idx != 4 { |
| 12 | sub_area.fill(&BLUE)?; |
| 13 | sierpinski_carpet(depth - 1, sub_area)?; |
| 14 | } else { |
| 15 | sub_area.fill(&WHITE)?; |
| 16 | } |
| 17 | } |
| 18 | } |
| 19 | Ok(()) |
| 20 | } |
| 21 | |
| 22 | const OUT_FILE_NAME: &'static str = "plotters-doc-data/sierpinski.png" ; |
| 23 | fn main() -> Result<(), Box<dyn std::error::Error>> { |
| 24 | let root = BitMapBackend::new(OUT_FILE_NAME, (1024, 768)).into_drawing_area(); |
| 25 | |
| 26 | root.fill(&WHITE)?; |
| 27 | |
| 28 | let root = root |
| 29 | .titled("Sierpinski Carpet Demo" , ("sans-serif" , 60))? |
| 30 | .shrink(((1024 - 700) / 2, 0), (700, 700)); |
| 31 | |
| 32 | sierpinski_carpet(5, &root)?; |
| 33 | |
| 34 | // To avoid the IO failure being ignored silently, we manually call the present function |
| 35 | root.present().expect("Unable to write result to file, please make sure 'plotters-doc-data' dir exists under current dir" ); |
| 36 | println!("Result has been saved to {}" , OUT_FILE_NAME); |
| 37 | |
| 38 | Ok(()) |
| 39 | } |
| 40 | #[test] |
| 41 | fn entry_point() { |
| 42 | main().unwrap() |
| 43 | } |
| 44 | |