hobbs_cherniak_penne_deep · HobbsQLIQUE
Hobbs QLIQUE (Tyler Hobbs — QQL dense-streamline tangle)
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). ~2400 agents each draw 1100 path steps through a single shared Perlin angle grid, with the canvas plus a wide margin so that streams that wander out can curve back in. Each segment is deposited with a low alpha (~0.05), and the hue shifts slowly with time so that each path becomes a thin colour ribbon rather than a single static colour. The result is the chaotic, emergent, single-image look that defines the QL aesthetic — a flow field run at much higher agent / step density than Hobbs's earlier Fidenza and Incomplete Control.
Original: https://www.tylerxhobbs.com/words/qql
▶ 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
Build G[i, j] = 2*pi * P(i*s, j*s) over a (rows, cols) grid with margin ~60%. Spawn N agents uniformly in the canvas+margin box. At each step: x_{t+1} = x_t + L*cos(G[floor(x), floor(y)]); y_{t+1} = y_t + L*sin(G[floor(x), floor(y)]); h(t) = h0 + omega*t (mod 1). Each segment painted with alpha 0.05 on a cream background, with the 3x3 Gaussian splat narrower than HobbsFlowField to keep the higher-density weave readable.
Parameters
| Name | Type | Default | Range | Description |
|---|---|---|---|---|
dim | int | 600 | 200–1500 | Square canvas side length (px). |
num_agents | int | 2400 | 200–8000 | Number of streamline agents N. |
path_steps | int | 1100 | 100–3000 | Steps each agent takes. Total segments = N * path_steps. |
resolution_frac | float | 0.01 | 0.002–0.05 | Grid cell size as fraction of dim (Hobbs: ~0.005-0.015). |
margin_frac | float | 0.6 | 0–1.5 | Field margin beyond canvas, fraction of dim (QQL uses wide margins). |
noise_scale | float | 0.09 | 0.01–0.5 | Perlin noise spatial frequency. |
noise_octaves | int | 2 | 1–6 | Number of Perlin octaves to sum (fBm). |
noise_persistence | float | 0.55 | 0.1–0.9 | Amplitude ratio between successive octaves. |
step_length | float | 1.2 | 0.1–8 | Per-step pixel advance along the cell's field angle. |
hue_base | float | 0.58 | 0–1 | Base hue (0-1) of the ribbon palette. |
hue_band | float | 0.18 | 0–0.5 | Per-agent hue spread around hue_base. |
alpha | float | 0.05 | 0.005–0.4 | Per-segment alpha. QQL uses ~0.04-0.08 with many overlapping agents. |
background | tuple | 245,240,232 | null–null | Background RGB colour (Hobbs cream). |
Reference
First 60 lines of reference.py. Full source:
library_external/hobbs_cherniak_penne_deep/HobbsQLIQUE/reference.py
"""HobbsQLIQUE — Tyler Hobbs dense-streamline tangle of curves.
Inspired by the "QLIQUE" / "QL-style" aesthetic that emerged from
Tyler Hobbs's 2022 QQL release with Dandelion Mane: a dense, chaotic
tangle of curves where every curve is a streamline through a Perlin
flow field, and the whole field is filled with N agents each drawing
K path steps.
Hobbs's own description (LACMA, 2024):
"QQL and Fidenza share one core component, which is an
underlying flow field that structures most of the image. ...
QQL takes a lot of care to establish larger structures that
interact with the flow fields in various ways that tend to have
a lot of emergent possibility."
The QLIQUE kernel we implement:
1. Build a Perlin angle grid covering the canvas plus a wide
margin (so strands that wander out can curve back in).
2. Spawn N agents, each at a random starting position, each
with a small "shape vector" of K angles drawn from the seed.
3. Each agent steps along the local field angle. The agent's
hue cycles slightly with each step (the "QL color band"
technique that gives QQL its translucent, ribbon-like look).
4. Each segment is deposited with a low alpha, building up the
dense tangle over a fixed number of steps.
This is much denser than HobbsFlowField (1500 agents, 1500 steps):
~2000-3000 agents, each completing 800-1500 path steps, ~2-3 million
segments total — the "chaotic single image" of the QL aesthetic.
Reference:
- https://www.tylerxhobbs.com/words/qql
- https://qql.art
- https://unframed.lacma.org/2024/06/05/remembrance-things-future-conversation-tyler-hobbs-artist-experimenting-blockchain
"""
from __future__ import annotations
from typing import ClassVar
import numpy as np
# ---------------------------------------------------------------------------
# Vectorised 2D Perlin noise (the kernel Hobbs uses to initialise the field)
# ---------------------------------------------------------------------------
def _fade(t: np.ndarray) -> np.ndarray:
return t * t * t * (t * (t * 6 - 15) + 10)
def _perlin2(perm: np.ndarray, x: np.ndarray, y: np.ndarray) -> np.ndarray:
xi = np.floor(x).astype(np.int64) & 255
yi = np.floor(y).astype(np.int64) & 255
xf = x - np.floor(x)
yf = y - np.floor(y)
u = _fade(xf)
v = _fade(yf)
dirs = np.array( 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/HobbsQLIQUE/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 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 Imprecise Balance (Aaron Penne stacked-blocks column)
hobbs_cherniak_penne_deep · PenneImpreciseBalance
A column of stacked rectangular blocks where each block is rotated by a seed-derived angle.
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.