Skip to the plate
FORMA PUBLIC DOMAIN GENERATIVE ATLAS / ED. 0.28
Plate 39, Hopalong: a still of the map / piecewise root plate as the atlas renders it, in the attractors accent.

PL. 39  ·  ATTRACTORS / MAP / PIECEWISE ROOT

Hopalong

Barry Martin, 1986

OPEN THE LIVE PLATE ▸

DEFINITION

xₙ₊₁ = yₙ − sign(xₙ)·√|b·xₙ − c|
yₙ₊₁ = a − xₙ

NOTES

Martin’s orbit hops between interleaving rings, and the rings assemble into wallpaper. Dewdney printed it under the title "Wallpaper for the mind" and readers left it running for days. It never settles and never repeats — the pattern keeps growing outward for as long as the machine keeps iterating, which is why the exposure below restarts the orbit once it has filled its measured frame.

PROVENANCE

Origin
Barry Martin, Aston University; published in A. K. Dewdney’s "Computer Recreations", Scientific American, September 1986
Standing
Public domain — an iterated map
Constants
Almost any (a, b, c) makes wallpaper; the window is measured from the orbit itself

HOUDINI · VEX

The same published mathematics as a Detail Wrangle body. Paste it into a Wrangle with Run Over set to Detail; every constant is the published value plus a tweak channel, so Create Spare Parameters gives a slider that starts where the paper does.

// FORMA — PL. 39 · HOPALONG — Barry Martin, 1986
//   xₙ₊₁ = yₙ − sign(xₙ)·√|b·xₙ − c|
//   yₙ₊₁ = a − xₙ
// Paste into a Detail Wrangle (Run Over: Detail), no inputs needed.
// Written from the published mathematics, not adapted from any code.
// Constants arrive at their published values. Press the node's Create
// Spare Parameters button and every tweak becomes a slider — starting
// at 0, the published figure, and moving in the constant's own units.
// https://forma-gen.com/#plate=hopalong

float p_a = 2 + chf('a_tweak');       // a · live -10 .. 10
float p_b = 1 + chf('b_tweak');       // b · live 0.05 .. 3
float p_c = 0 + chf('c_tweak');       // c · live 0 .. 8

// The plate's own colour: FORMA's ATTRACTORS accent as a cosine ramp,
// brightest near t = 0 and t = 1, near-black around t = 0.5.
vector forma_ramp(float t){
  return set(
    0.0956 + 0.1039 * cos(6.28318530718 * (t + 0)),
    0.4041 + 0.4392 * cos(6.28318530718 * (t + 0.05)),
    0.46 + 0.5 * cos(6.28318530718 * (t + 0.1)));
}

// The plate measures the orbit's extent to size its window, then replays the
// same orbit; geometry needs no window, so this is the orbit itself — one
// deterministic walk from the origin, growing ring by ring.
int forma_pts = 220000;

float x = 0.0, y = 0.0;
for (int i = 0; i < forma_pts; i++){
    float nx = y - sign(x) * sqrt(abs(p_b * x - p_c));
    y = p_a - x;
    x = nx;
    // canvas y runs down; negated so the figure sits as the plate shows it
    int pt = addpoint(0, set(x, -y, 0.0));
    float u = float(i) / float(forma_pts);
    setpointattrib(0, "Cd", pt, forma_ramp(0.8 + 0.3 * u));
}