1 use plotters::coord::Shift;
2 use plotters::prelude::*;
3 
sierpinski_carpet( depth: u32, drawing_area: &DrawingArea<BitMapBackend, Shift>, ) -> Result<(), Box<dyn std::error::Error>>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";
main() -> Result<(), Box<dyn std::error::Error>>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]
entry_point()41 fn entry_point() {
42     main().unwrap()
43 }
44