I completed part of a 30-day challenge to make generative art daily by following a series of daily prompts.
To the right is my response to the prompt from Day 8: Curve only. No straight lines here. I used flow field of vectors generated from Perlin noise. The flows affect the streamlines, which are placed using a method described in this excellent paper. As a final step, I offset the streamlines with variable stroke widths, for calligraphic effect.
Day 10: Trees. I took this prompt pretty literally and made algorithmically generated trees. Starting from the trunk, each segment is split into two branches, each of which is subsequently split again and again. Most of these have 10 levels, yielding 2 ^ 9 = 1024 leaves at the end. To increase realism, I randomized the the angles of each split and the lengths of the branches. I also adjust the branch angles the more horizontal they are and proportional to the number of downstream branches, simulating the effect of gravity on the growth.
These are additional process images from the tree algorithm. The gradients in some of these images were helpful for debugging, and to demonstrates, using color, that each of the thinnest endmost branches ("leaves" in tree lingo) is made of a line that can be traced all the way back to the trunk, without crossing with any other branches' lines (except when the overall tree structure causes entire branches to overlap/cross). So although they look like solid fills, these trees are actually drawn as strokes, making these trees plotter compatible. The hexagonal-looking variant is how the output looks without any randomization or weight simulation.
From Day 1: Triple-Nested Loop. I used ln.js — and a loop inside a loop inside a loop — to create repeating 3D forms and a strong perspective.
Day 2: Rule 30. Rule 30 is one of several types of cellular automata formalized and explored by Stephen Wolfram, where a complex pattern “grows” out of a few simple rules. Since Rule 30 produces roughly a 50-50 distribution of fills and voids, I figured it’d be interesting to roll the pattern on itself, like a Swiss roll, such that more of the pattern can be seen through the “windows” created by the gaps.
Day 4: Small areas of symmetry. This turned out the easiest/quickest prompt response I came up with during the challenge. The algorithm is pretty simple: 1) start out with 3 random points really close to each other; 2) derive a polygon hull that encompasses all the points; 3) pick an edge of the hull and copy-mirror all the points about that edge, creating symmetry; 4) repeat steps 2 & 3 until the hull covers most of the canvas; 5) draw a Voronoi diagram around the resulting points. This process yields a surprising amount of variability and complexity, and I included a few variations here.
Day 3: Make something human. I had been working on an algorithim to turn grayscale images into lines with varying densities. I used it to render a picture of a chimp. Not completely satisfied with the look of the algorithm result. A bit to much turbulence and a few glitchy regions with straigh lines. But it does have that effect where it becomes photoreal when viewed from far away.
Day 6: Triangle subdivision. Used a source image to distribute points on the canvas then used delaunay triangulation to connect the points and form a mesh.