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.