1use plotters::coord::Shift;
2use plotters::prelude::*;
3
4pub 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
22const OUT_FILE_NAME: &'static str = "plotters-doc-data/sierpinski.png";
23fn 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]
41fn entry_point() {
42 main().unwrap()
43}
44