Skip to content
Sample of Penne Imprecise Balance (Aaron Penne stacked-blocks column)

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.

Family
hobbs_cherniak_penne_deep
Source
hobbs_cherniak_penne_deep
Evolution
geometry
Render
stacked_rotated_rectangles
Complexity
low
Agents
24
Year
2021
Author
Aaron Penne (algorithmic homage)

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

Sample of Cherniak Constellations (Dmitri Cherniak point-cloud + graph)

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.

View →
Sample of Cherniak Nibbles (Dmitri Cherniak cell-eating cellular automata)

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.

View →
Sample of Hobbs Color-Field Overlay (Tyler Hobbs compositional method)

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.

View →
Sample of Hobbs QLIQUE (Tyler Hobbs — QQL dense-streamline tangle)

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).

View →
Sample of Hobbs Spirograph (Tyler Hobbs — Petal Loops / Elektroanima)

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.

View →
Sample of Penne Ringers (Aaron Penne concentric ring extrusion)

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.

View →

See all hobbs_cherniak_penne_deep artworks →