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));
}