This repository has no description
1use itertools::Itertools;
2use rand::{Rng, SeedableRng};
3use shapemaker::*;
4
5fn artwork() -> Canvas {
6 let mut rng = rand::rngs::StdRng::seed_from_u64(42);
7 let mut canvas = Canvas::with_colors(ColorMapping {
8 black: "#000000".into(),
9 white: "#ffffff".into(),
10 red: "#cf0a2b".into(),
11 green: "#22e753".into(),
12 blue: "#2734e6".into(),
13 yellow: "#f8e21e".into(),
14 orange: "#f05811".into(),
15 purple: "#6a24ec".into(),
16 brown: "#a05634".into(),
17 pink: "#e92e76".into(),
18 gray: "#81a0a8".into(),
19 cyan: "#4fecec".into(),
20 });
21 canvas.set_grid_size(16, 9);
22 canvas.set_background(Black);
23
24 let draw_in = canvas.world_region.resized(-2, -2);
25
26 // Strands
27
28 let strands_in =
29 Region::from_bottomleft(draw_in.bottomleft().translated(2, -1), (3, 3))
30 .unwrap();
31
32 let strands =
33 canvas.n_random_curves_within(&mut rng, &strands_in, 30, "strands");
34
35 canvas.add_layer(strands);
36
37 for (i, (_key, obj)) in canvas
38 .layer_unchecked("strands")
39 .objects
40 .iter_mut()
41 .sorted_by_key(|(k, _)| *k)
42 .enumerate()
43 {
44 obj.recolor(if i % 2 == 0 { Cyan } else { Pink });
45 obj.filter(Filter::glow(4.0));
46 }
47
48 // Red dot
49
50 let red_dot = Shape::BigCircle(
51 Region::from_topright(draw_in.topright().translated(-3, 1), (4, 3))
52 .unwrap()
53 .random_point(&mut rng),
54 )
55 .colored(Red)
56 .filtered(Filter::glow(5.0));
57
58 canvas.new_layer("red dot").add_anon(red_dot.clone());
59
60 // Hatched circles & squares
61
62 let hatches = canvas.new_layer("hatches");
63
64 for (i, point) in draw_in.except(&strands_in).enumerate() {
65 if red_dot.region().contains(&point) {
66 continue;
67 }
68 if rng.random() {
69 Shape::BigCircle(point)
70 } else {
71 Shape::Rectangle(point, point)
72 }
73 .filled(White.hatches(
74 Angle::from_degrees(45.0),
75 (i + 5) as f32 / 10.0,
76 0.25,
77 ))
78 .add_to(hatches);
79 }
80
81 canvas
82}
83
84pub fn main() {
85 artwork()
86 .render_to_png("dna-analysis-machine.png", 480)
87 .unwrap();
88}
89
90#[test]
91fn test_artwork() {
92 use insta;
93 insta::assert_snapshot! { artwork().render_to_svg_string().unwrap() }
94}