- At each step, you will start with a region of the page.
- Draw something that fills that region
- Then split the region into four sub-regions
- For the first three of the four sub-regions, recurse to step 1
Musings, ramblings, rantings about technology, games, puzzles, and whatever else catches my attention.
This was a pretty easy thing at its base - I generated a set of points using a Bridson Blue Noise Generator, one of my favorites. I then used SciPi's Delaunay to turn these points into a triangular mesh. I then pulled edges at random from that mesh into a spanning tree - visiting each vertex exactly once (no loops).
At this point, the image on screen was complete, but I knew it would draw poorly on the AxiDraw to draw each edge individually, so I wrote a routine to glue edges together into paths, which mostly worked, but I overdrew a few edges (paths with a single edge?) which worked out OK.
Also, some of the edges didn't draw at all, the pen hit a dry spot, which happened a surprising number of times.
Tools Used: AxiDraw, Pentel 5mm pen
Languages Used: Python
Development Time: ~2 hours
Drawing Time: ~1 hour
What's Generative Here: I started with a generated set of points, I connected the points into a spanning tree by randomly including edges.
I discovered that my work had given me yesterday off as a holiday, and rather than spend it volunteering to help others, or reading a speech or a book by Martin Luther King, Jr., or even reading a book about Unreal Engine C++ code, instead, I spent the day working on my ray marcher, with the hopes of having an island with rolling polygonal hills, and obscure towers rising into the sky.
Which would have been a cheat, in itself, because that image, that I worked almost all of yesterday on, would have been my submission for today's prompt.
Fortunately(?) the polygonal mesh dragged my renderer's performance to its knees, so I couldn't meaningfully iterate on my intended image.
Instead, I give you less ornate, less random, but still vaguely tower-ish stacks of primitives. The bottom tier is uniformly medium gray and of identical size, the next tier up has more size variability, and is picked from red, green, or blue. The last cylinder has more size variability, and is picked from a set of 6 colors, and the spheres on top from a continuum of colors.
For a while, I was struggling to reconcile this idea with randomness increasing along Y, because in my renderer, in my mental model, up is +Z, and to pass this off as randomness increasing along Y meant that either I was fudging the prompt, or I was adopting a +Y up model, which I know some people prefer, but for me, the X-Y plane belongs on the horizontal.
But, if you consider that the screen projections of these colorful towers reach upwards along screen Y, then the previous paragraph's concerns mostly fade away. Except that, often, positive screen Y goes down. (Sigh) So, again, we do some gymnastics, and either say that the prompt doesn't specify that randomness increases along the positive Y axis, or we look to the drawing APIs that prefer to have the origin in the lower left corner, to better resemble the diagrams in 7th grade algebra books.
So, we have tower-like stacks of primitives, with their color, and some of their dimensions, increasing in randomness as one goes up. Good enough.
Still a compromise, because it's not the image I had in mind.
Still a cheat of the schedule, because I did my part of the work yesterday, and the rendering completed this morning around 3am.
I look at these towers, which I've been trying to get you to see as stacks of colorful blocks, and I see abstract people. I've kicked off a render of a variation of this inspired in that direction. Maybe that will be less of a cheat, since I'm doing it today.
Also, I don't know what's going on with the red tower in the background, missing a tier. Either a bug in my placement code or a bug in my octtree spatial partition code, which is what I was struggling with all day yesterday.
I did learn a few neat things, and applied them yesterday:
grow - which started on the edge of the grid, moving space to space, placing "food" in the grid, making the cells come "alive". In the raster version, a single process would have a single (random) color, but you can't see that in the plotted version.
prune - which started on the edge of the grid, and moved in longer, straighter, lines, removing the food as it goes. If it reached the end of the map, it terminated.
I ran 100 of each of grow and prune, alternating to produce this pattern.
![]() |
This is a pretty loose interpretation of the prompt, and it's generative in the "how" of what's being drawn, but not of the "what" of what's being drawn. I went to the Art Institute of Chicago's page, and found a couple impressionist CC0 paintings.
I generated a blue noise point grid, and a flow field for each painting. I generated particles at each point of the point grid, and traced their motion along the flow grid flowing in and out of their designated point.
It looks pretty good as an animated GIF - frames overlay previous frames, so you don't see the gaps between particles, except for at the very beginning.
To contrast, the video on YouTube:
You can totally see the gaps between the particles.
Tools Used: Art Institute of Chicago's web page to download the CC0 source images. Pillow, ImageMagick, ffmpegLanguages Used: PythonDevelopment Time: ~4 hoursDrawing Time: ~15 minutes (and then further processing to make the GIF and MPG animations)What's Generative Here: The flow fields and underlying point grids are random, but that's not where the eye lands. You see the familiar paintings, so I'm not 100% satisfied that this is as generative as it could be. I could generate images to use as my source material, which would be more generative. Or, maybe if you think of the individual particles as having a chunk of data each, on each frame, the particles collaborate to generate the image. Feels like a stretch.