Alert Email External Link Info Letterboxd 0.5/5 stars 1/5 stars 1.5/5 stars 2/5 stars 2.5/5 stars 3/5 stars 3.5/5 stars 4/5 stars 4.5/5 stars 5/5 stars RSS Source Topic Twitter
I’m redesigning this site in public! Follow the process step by step at

Revisiting Incomplete Open Cubes

Behind the scenes of an obsessive art project

The idea becomes a machine that makes the art.

I felt the first rumblings of the obsession a little over a year ago. I’m a big fan of Sol LeWitt’s wall drawings, and on a pilgrimage to MASS MoCA’s sprawling retrospective exhibition of them, I glimpsed some curious cube structures by LeWitt scattered around the museum. A short while later, in a used bookstore in Philadelphia, I stumbled upon a book which introduced me to the larger 1974 work those structures represented: Incomplete Open Cubes. To say it spoke to me would be an understatement. As I spent more and more time scrutinizing it, I started to notice avenues of thought the work had neglected or declined to pursue, ways that LeWitt’s definition of an incomplete open cube was less forgiving than my own.

Fig. 1: Early sketches

I started sketching possibilities, first on paper, then in Adobe Illustrator, trying to work out a system that would produce the massive set of cube variations I envisioned (Fig. 1). After drawing several hundred variations, I started to recognize a formula that could be translated into code, so I moved over to DrawBot, which programmatically generates vector art using Python. A few days later, I had a script that created basic line drawings of the full set of 4,094 cube variations, and I layered in enhancements from there. Without getting into the nuts and bolts of the code itself (which you can explore on GitHub), let’s unpack the machine that makes the art.

How to draw 4,094 variations on incomplete open cubes

  1. Define the parts

    Fig. 2: The twelve parts of an open cube

    A cube is framed by 12 edges, so an incomplete open cube can have as few as one part and as many as 11 parts. Each part is assigned a number. Viewing the cube in isometric perspective, part one lies flat on the right side of 12:00 on the base of the cube. From there, part numbers ascend clockwise around the base, followed by the vertical posts, and finally the top (Fig. 2).

  2. Find every possible unique combination of parts

    The first 12 combinations technically aren’t combinations. Each consists of just one of the 12 parts. Those 12 parts are then each made the basis for a series of two-part combinations: one-two, one-three, one-four, etc. Each two-part combination is then likewise made the basis for a series of three-part combinations: one-two-three, one-two-four, one-two-five, etc. Three-part combinations exponentially yield four-part combinations (Fig. 3), which exponentially yield five-part combinations, and so on down the line. As each new combination is created, it’s added to a master list of unique combinations. If the combination is already in the list, it gets discarded, which is more often the case than not. At the end of the process, the discard pile contains a whopping 20,481 duplicates, more than five times the amount of unique combinations.

    Fig. 3: The one-two-three combination (top left), followed by all of the four-part combinations that can be made from it

  3. Draw the unique combinations

    Now that the heavy lifting is done and we have a list of all the unique combinations, the rest is a breeze, right? Well, not exactly. The vector art we’re generating is two-dimensional and doesn’t inherently understand how the cube’s parts would interact in a three-dimensional space. This can lead to some awkward overlaps that disrupt the drawing’s 3-D illusion. There are two steps to dealing with this.

    Fig. 4: When drawn in sequence, parts three, four, and five disrupt the 3-D illusion.

    The first step is to change the stacking order. Try as it might, the numeric sequence of parts doesn’t quite match the way the elements need to be arranged in space. For example, part four should be behind part three, but it’s drawn on top of it (Fig. 4). If we change the parts’ stacking order, they’ll play more nicely together. A few different orders would work, but here’s the one I’m using:

    Fig. 5: Changing the stacking order helps, but parts four and five are still fighting with each other.

    1. part 11
    2. part 10
    3. part 7
    4. part 3
    5. part 2
    6. part 6
    7. part 1
    8. part 9
    9. part 12
    10. part 5
    11. part 8
    12. part 4

    Changing the stacking order helps, but it doesn’t solve everything (Fig. 5). Some parts just aren’t going to get along without additional intervention. Specifically, parts one, two, three, five, and nine need alternate versions in certain situations (Fig. 6):

    Fig. 6: The alternate version of part five doesn’t interfere with part four.

    • If parts one and four are present, use part one’s alternate
    • If parts one and five are present, use part one’s alternate
    • If parts two and six are present, use part two’s alternate
    • If parts three and eight are present, use part three’s alternate
    • If parts four and five are present, use part five’s alternate
    • If parts nine and 12 are present, use part nine’s alternate

Now that everything is in order, all of those unique combinations can be drawn without incident.

As a novice programmer, it was pretty satisfying to figure out how to translate the process above into Python, even if my code is probably far less efficient than it could be. And as an admirer of Sol LeWitt, it’s a real joy to become so immersed in his work in this way. Incomplete Open Cubes is fertile ground, and this probably won’t be my last exploration of it. In the meantime, I hope you find this first result as mesmerizing as I do.