hobbs_cherniak_penne_deep · PenneImpreciseBalance
Penne Imprecise Balance (Aaron Penne stacked-blocks column)
A column of stacked rectangular blocks where each block is rotated by a seed-derived angle. The visual is a tall, slightly-leaning tower that looks like a Jenga stack that has been pushed just enough to feel precarious — the canonical Penne 'silk-sheet-to-canyon' spectrum calibrated towards the precarious end. Each block is filled with a colour drawn from a muted Penne-style palette (low-saturation, mid-brightness). The cumulative rotation of the stack is noise-driven; once the cumulative rotation exceeds a balance threshold, the column 'collapses' (rotations are amplified), producing the cascading topple that is the visual signature of this formula. Penne's *Apparitions* essay (2021) describes the broader visual idiom of 'a series of lines stacked, but it brings dynamic 3D movement to a 2D rendering' — this formula is the most literal interpretation: a single tall column of stacked horizontal lines.
Original: https://www.aaronpenne.io
▶ Try the live demo (JS port) ▶ Run reference.py via Pyodide 10 formulas have instant JS ports. The Pyodide path runs the actual Python in your browser — first load is ~6 MB, then instant.
Math essence
For each block i in 0..N-1: draw a filled rectangle of width W and height H at centre (cx, y0 + i*(H+gap)), rotated by theta_i radians. theta_i is the cumulative sum of a Perlin-noise-driven offset, where the per-block offset is value_noise_1d(i) * max_rotation. If |sum(theta_i)| > balance_threshold, the column collapses: amplifications of (|sum| - threshold) are added to the rotation, producing the cascading topple.
Parameters
| Name | Type | Default | Range | Description |
|---|---|---|---|---|
dim | int | 600 | 200–1500 | Square canvas side length (px). |
num_blocks | int | 24 | 3–200 | Number of blocks N in the column. |
block_width_frac | float | 0.55 | 0.05–1 | Block width as a fraction of dim. |
block_height_frac | float | 0.03 | 0.005–0.2 | Block height as a fraction of dim. |
max_rotation | float | 6 | 0–30 | Maximum rotation per block (degrees). |
rotation_noise_scale | float | 0.4 | 0.05–2 | Perlin noise scale for the rotation field. |
balance_threshold | float | 90 | 10–360 | Cumulative rotation (deg) at which the column collapses. |
palette_mode | str | gradient | null–null | 'mono' / 'gradient' / 'noise'. |
background | tuple | 240,236,226 | null–null | Background RGB colour (Penne cream). |
seed | int | 42 | null–null | RNG seed. |
Reference
First 60 lines of reference.py. Full source:
library_external/hobbs_cherniak_penne_deep/PenneImpreciseBalance/reference.py
"""PenneImpreciseBalance — Aaron Penne stacked-blocks column.
A direct homage to Aaron Penne's *Imprecise Balance* (2021):
a column of stacked rectangular forms where each block is
rotated by a seed-derived angle. The result is a tall,
slightly-leaning tower that looks like a Jenga stack that
has been pushed just enough to feel precarious.
Penne's *Apparitions* essay (2021) describes the broader
visual idiom:
"I had been working with this layered form for several
years. It just holds so much mystery to me. It is a series
of lines stacked, but it brings dynamic 3D movement to a
2D rendering with the right parameter space and aesthetic.
By tweaking parameters, it creates very different feelings,
from the comfort of a silk sheet to the rugged adventure
of canyons."
The *Imprecise Balance* kernel we implement:
1. A column of N rectangular blocks is stacked vertically,
each block of width w and height h.
2. Each block i has its own rotation theta_i (in degrees),
drawn from a Perlin-noise-driven field so the rotations
feel "deliberately imprecise" rather than random.
3. The column's centre-of-mass is computed as the rotation-
weighted average of each block's centre; if the column
exceeds a "balance threshold", the column collapses
(the rotation cascade is amplified).
4. Each block is filled with a colour drawn from a muted
Penne-style palette (low-saturation, mid-brightness).
5. A subtle horizontal noise is overlaid on each block to
give it a hand-drawn / noisy feel (the Penne aesthetic
of "algorithm + organic imperfection").
The visual is a tall, slightly-leaning stack of rectangles
that feels "imprecisely balanced" — the canonical Penne
silk-sheet-to-canyon spectrum, calibrated towards the
precarious end.
Reference:
- https://www.aaronpenne.io
- https://artynft.io/interviews/aaron-penne/ (Penne interview)
- Penne's broader *Apparitions* essay:
https://www.artxcode.io/journal/aaron-penne-apparitions-on-art-blocks
"""
from __future__ import annotations
from typing import ClassVar
import numpy as np
def _value_noise_1d(rng: np.random.Generator, n: int, grid: int) -> np.ndarray:
"""Simple value noise in 1D, like Penne's noise field."""
g = rng.normal(0, 1, size=grid + 1)
xs = np.linspace(0, grid, n)
xi = np.floor(xs).astype(np.int64)
xf = xs - xi Try running it locally
The reference implementation is self-contained Python with numpy. Install the package and run:
python library_external/hobbs_cherniak_penne_deep/PenneImpreciseBalance/reference.py Need help? See Learn for the standard environment setup, or Playground for an in-browser sketchbook.
More from hobbs_cherniak_penne_deep
Cherniak Constellations (Dmitri Cherniak point-cloud + graph)
hobbs_cherniak_penne_deep · CherniakConstellations
A pseudo-random point cloud with connecting lines filtered by distance, producing graph-like emergent forms.
Cherniak Nibbles (Dmitri Cherniak cell-eating cellular automata)
hobbs_cherniak_penne_deep · CherniakNibbles
A cellular-automata growth algorithm in the spirit of Dmitri Cherniak's body of work — small 2D shapes ('nibbles') that grow by selectively removing neighbours.
Hobbs Color-Field Overlay (Tyler Hobbs compositional method)
hobbs_cherniak_penne_deep · HobbsColorFieldOverlay
Hobbs's compositional method of choice: combine TWO independent fields — a Perlin flow field that drives the *trajectory* of a set of line segments, and a Gaussian-blurred colour field that drives the *colour* and *opacity* of those segments.
Hobbs QLIQUE (Tyler Hobbs — QQL dense-streamline tangle)
hobbs_cherniak_penne_deep · HobbsQLIQUE
A dense tangle of curves where every curve is a streamline through a Perlin flow field, in the visual spirit of Tyler Hobbs's 2022 QQL release (with Dandelion Mane).
Hobbs Spirograph (Tyler Hobbs — Petal Loops / Elektroanima)
hobbs_cherniak_penne_deep · HobbsSpirograph
A rotating-circular-arc trail in the spirit of Tyler Hobbs's *Petal Loops* (2020) and *Elektroanima* (2020) — works described by Hobbs as 'looping taken to an excessive level.' M rotating points (default 8) are connected by a closed polyline that morphs each frame as the whole ring rotates by a small angle around a central anchor.
Penne Ringers (Aaron Penne concentric ring extrusion)
hobbs_cherniak_penne_deep · PenneRingers
Penne's take on the *Ringers* idiom (best known from Cherniak's Art Blocks release, 2021): concentric rings extruded along the Z axis, rotated about a common axis, projected to 2D.