Skip to the plate
FORMA PUBLIC DOMAIN GENERATIVE ATLAS / ED. 0.28
Plate 80, Zaslavsky Web Map: a still of the kicked rotor / web plate as the atlas renders it, in the attractors accent.

PL. 80  ·  ATTRACTORS / KICKED ROTOR / WEB

Zaslavsky Web Map

George M. Zaslavsky and colleagues, 1986

OPEN THE LIVE PLATE ▸

DEFINITION

uₙ₊₁ = (uₙ + K·sin vₙ)·cos α + vₙ·sin α
vₙ₊₁ = −(uₙ + K·sin vₙ)·sin α + vₙ·cos α
α = 2π/q

NOTES

A linear oscillator kicked in step with its own period, and the chaos it produces does not stay in a pocket — it joins up into a web that reaches across the whole plane, however weak the kick. When q is 3, 4 or 6 the mesh is a crystal, because those are the rotational symmetries that tile; at 5, 7 and 8 it cannot tile and comes out quasicrystalline, the same impossible symmetry a Penrose tiling has. The web is a set of thin channels between islands of regular motion, and a trajectory in it wanders arbitrarily far.

PROVENANCE

Origin
G. M. Zaslavsky, M. Yu. Zakharov, R. Z. Sagdeev, D. A. Usikov & A. A. Chernikov, "Stochastic web and diffusion of particles in a magnetic field", Soviet Physics JETP, 1986; developed at length in Zaslavsky, Sagdeev, Usikov & Chernikov, Weak Chaos and Quasi-Regular Patterns, Cambridge University Press, 1991
Standing
Public domain — an area-preserving map
Constants
q is a CHOICES list, not a slider sweep: only integers give the resonance the web is made of, and a fractional value between them is a different system with no symmetry at all

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. 80 · ZASLAVSKY WEB MAP — George M. Zaslavsky and colleagues, 1986
//   uₙ₊₁ = (uₙ + K·sin vₙ)·cos α + vₙ·sin α
//   vₙ₊₁ = −(uₙ + K·sin vₙ)·sin α + vₙ·cos α
//   α = 2π/q
// 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=zaslavsky

float p_q   = 5 + chf('q_tweak');         // q — fold symmetry · live 3 .. 8
float p_K   = 1 + chf('K_tweak');         // K — kick strength · live 0.4 .. 2.2
float p_run = 240 + chf('run_tweak');     // orbit length · live 60 .. 600

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

// Area-preserving again, and again the figure is the union of many orbits
// rather than any one of them: the stochastic web appears where the kicked
// rotation's chaotic layer threads between the islands.
int forma_pts = 120000;

float alpha = 6.28318530718 / rint(p_q);
float ca = cos(alpha), sa = sin(alpha);
float u = 0.0, v = 0.0;
int   run = int(p_run) + 1, si = 0;   // force a seed on the first step
for (int i = 0; i < forma_pts; i++){
    if (++run > int(p_run)){
        run = 0;
        // deterministic scattered restarts, mirroring the plate's seeded rng
        u = (random(si * 2) - 0.5) * 7.0;
        v = (random(si * 2 + 1) - 0.5) * 7.0;
        si++;
    }
    float w = u + p_K * sin(v);
    float nu = w * ca + v * sa;
    float nv = -w * sa + v * ca;
    u = nu;  v = nv;
    // canvas y runs down; negated so the web sits as the plate shows it
    int pt = addpoint(0, set(u, -v, 0.0));
    float uu = float(i) / float(forma_pts);
    setpointattrib(0, "Cd", pt, forma_ramp(0.8 + 0.3 * uu));
}