This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

at main 3.6 kB View raw
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}