Skip to the plate
FORMA PUBLIC DOMAIN GENERATIVE ATLAS / ED. 0.28
Plate 06, Phyllotaxis: a still of the packing / golden angle plate as the atlas renders it, in the curves accent.

PL. 06  ·  CURVES / PACKING / GOLDEN ANGLE

Phyllotaxis

Helmut Vogel, 1979 · after Kepler and Bravais

OPEN THE LIVE PLATE ▸

DEFINITION

θ(n) = n · 137.508°
r(n) = c · nᵏ,  k = ½ for equal area

NOTES

The arrangement of florets in a sunflower head. The angle is the golden angle, 360°(2−φ), and it is the unique rotation that never lets successive points line up into rows — which is exactly what a plant wants if every seed is to get light. Change it by a fifth of a degree and the spirals collapse into spokes.

PROVENANCE

Origin
Vogel's model, Mathematical Biosciences 44, 1979
Standing
Public domain — a description of a natural arrangement
Constants
137.508° is the golden angle; c only sets the scale
Source
doi:10.1016/0025-5564(79)90080-4

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. 06 · PHYLLOTAXIS — Helmut Vogel, 1979 · after Kepler and Bravais
//   θ(n) = n · 137.508°
//   r(n) = c · nᵏ,  k = ½ for equal area
// 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=phyllotaxis

float p_angle = 137.508 + chf('angle_tweak'); // divergence angle (°) · live 137 .. 138
float p_n     = 1400 + chf('n_tweak');        // floret count · live 200 .. 3000
float p_expo  = 0.5 + chf('expo_tweak');      // k — radial exponent · live 0.3 .. 0.8

// The plate's own colour: FORMA's CURVES 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.11 + 0.1196 * cos(6.28318530718 * (t + 0)),
    0.46 + 0.5 * cos(6.28318530718 * (t + 0.05)),
    0.2453 + 0.2667 * cos(6.28318530718 * (t + 0.1)));
}

// Vogel's spiral as a point cloud: floret i sits at angle i·137.508° and
// radius (i/n)^k, so the disc fills the unit circle. k = ½ is the equal-area
// packing; below it the florets crowd the rim, above it the centre — the
// whole disc restructures. pscale mirrors the plate's growing floret size.
int nf = int(p_n);
float ga = radians(p_angle);
for (int i = 1; i <= nf; i++){
    float u  = float(i) / float(nf);
    float th = float(i) * ga;
    float r  = pow(u, p_expo);
    // canvas y runs down; negated so the spiral winds as the plate shows it
    int pt = addpoint(0, set(r * cos(th), -r * sin(th), 0.0));
    // the full ramp, as the plate sweeps it — the dark mid-radius ring is
    // the palette's own trough reading as contour on a dense disc
    setpointattrib(0, "Cd", pt, forma_ramp(u));
    setpointattrib(0, "pscale", pt, (0.6 + 1.6 * u) / 150.0);
}

AFTER EFFECTS · DECLINED

Points, not a path: the Vogel spiral is a thousand florets placed one by one, and a line through them in order is a star of chords — a different figure.