This repository has no description
1use crate::{Canvas, Fill, Layer, Object, Region, Shape};
2use rand::{Rng, distr::uniform::SampleRange};
3use std::collections::HashMap;
4
5impl Canvas {
6 pub fn random_layer(&mut self, rng: &mut impl Rng, name: &str) -> Layer {
7 self.random_layer_within(rng, name, &self.world_region.clone())
8 }
9
10 pub fn random_object(&mut self, rng: &mut impl Rng) -> Shape {
11 self.random_object_within(rng, &self.world_region.clone())
12 }
13
14 pub fn random_object_within(
15 &mut self,
16 rng: &mut impl Rng,
17 region: &Region,
18 ) -> Shape {
19 Shape::random(
20 rng,
21 region,
22 self.object_sizes.default_line_width,
23 self.polygon_vertices_range.clone(),
24 )
25 }
26
27 pub fn n_random_curves_within(
28 &mut self,
29 rng: &mut impl Rng,
30 region: &Region,
31 count: usize,
32 layer_name: &str,
33 ) -> Layer {
34 let mut objects: HashMap<String, Object> = HashMap::new();
35 for i in 0..count {
36 let object = Shape::random_curve_within(
37 rng,
38 region,
39 self.object_sizes.default_line_width,
40 );
41 objects.insert(
42 format!("{}#{}", layer_name, i),
43 Object::from((
44 object,
45 if rng.random_bool(0.5) {
46 Some(Fill::random_solid(rng, self.background))
47 } else {
48 None
49 },
50 )),
51 );
52 }
53
54 Layer {
55 object_sizes: self.object_sizes,
56 name: layer_name.to_owned(),
57 objects,
58 hidden: false,
59 }
60 }
61
62 pub fn random_curves_within(
63 &mut self,
64 rng: &mut impl Rng,
65 layer_name: &str,
66 region: &Region,
67 object_counts: impl SampleRange<usize>,
68 ) -> Layer {
69 let number_of_objects = rng.random_range(object_counts);
70 self.n_random_curves_within(rng, region, number_of_objects, layer_name)
71 }
72
73 pub fn random_layer_within(
74 &mut self,
75 rng: &mut impl Rng,
76 name: &str,
77 region: &Region,
78 ) -> Layer {
79 let mut objects: HashMap<String, Object> = HashMap::new();
80 let number_of_objects =
81 rng.random_range(self.objects_count_range.clone());
82 for i in 0..number_of_objects {
83 let object = Shape::random(
84 rng,
85 region,
86 self.object_sizes.default_line_width,
87 self.polygon_vertices_range.clone(),
88 );
89 let hatchable = object.hatchable();
90 objects.insert(
91 format!("{}#{}", name, i),
92 object.filled(if hatchable {
93 Fill::random_hatches(rng, self.background)
94 } else {
95 Fill::random_solid(rng, self.background)
96 }),
97 );
98 }
99
100 Layer {
101 object_sizes: self.object_sizes,
102 name: name.to_string(),
103 objects,
104 hidden: false,
105 }
106 }
107
108 pub fn random_linelikes(
109 &mut self,
110 rng: &mut impl Rng,
111 layer_name: &str,
112 ) -> Layer {
113 self.random_curves_within(
114 rng,
115 layer_name,
116 &self.world_region.clone(),
117 self.objects_count_range.clone(),
118 )
119 }
120
121 pub fn random_region(&mut self, rng: &mut impl Rng) -> Region {
122 Region::random(rng, &self.world_region.clone())
123 }
124}