Two thousand circles placed at the golden angle, which is the only angle that never lines up.
Two lines of arithmetic
double radius = Radius * 2 * Math.Sqrt(i + 0.5);
double angle = GoldenAngle * (i + 0.5);
That is the whole placement. The ith circle sits at radius proportional to √i
and at angle i × θ, where
double GoldenAngle = Math.PI * (3 - Math.Sqrt(5)); // ≈ 137.507764°
This is Vogel’s model of phyllotaxis, published in 1979 as a description of how
seeds sit in a sunflower head. It has exactly two ingredients, and both of them are
doing something specific.
The first hundred circles. There is no row structure and no radial structure, and it
is worth noticing how unusual that is — almost any other constant angle would
produce visible spokes within a dozen placements.
Why the square root
Radius grows as √i because area grows as radius squared. A disc of radius r has
area πr², so to place circles at constant density the ith one must sit at radius
proportional to √i. Any other exponent crowds the middle or the rim.
That is why the finished piece has no visible gradient of density: the packing is
uniform by construction, and the only thing that changes from centre to edge is the
alpha, which ramps from 150 to 255 across the sequence so the outer circles read
slightly brighter than the inner ones.
A sixth of the way out. Spiral arms have appeared — and nothing in the code draws an
arm. They are an artefact of the eye connecting circles whose indices differ by a
fixed amount.
Why the golden angle
π(3 − √5) radians is 360°/φ², about 137.5°. It is the angle whose ratio to a full
turn is the most irrational number there is.
That matters because if the angle were a rational fraction of a turn — say exactly
1/7 — then every seventh circle would land on the same ray and the pattern would
be seven spokes with gaps between them. Any rational angle gives spokes; any angle
close to a simple rational gives near-spokes, which is worse, because the gaps
appear at large radius where there is most room to notice them.
The golden angle is as far from every simple rational as an angle can be. Its
continued fraction is all ones, which is the mathematical statement of “hardest to
approximate”. So the circles never line up, at any radius, for any period.
A third. The arm count has changed. Look at the visible arms near the centre and
count them, then count the ones at the rim: both counts are Fibonacci numbers, and
they are consecutive. As the radius grows the eye abandons one family of arms for the
next Fibonacci number up, because that family is the one whose members are currently
closest together.
That is the same reason sunflower heads have 34 and 55 spirals, and pinecones 8 and
13 — the arms are the convergents of the continued fraction of 1/φ², and nothing
chose them.
Two thirds. The transition between arm families is happening continuously across the
radius; there is no point at which it occurs.
Two thousand circles. Every one of them at the same radius step, the same angle
increment, and the same drawn size.
One radius, two jobs
One detail worth stating plainly: Radius does two jobs. It is the drawn size
of the mark, and it is also the step of the spiral — the lattice is set by
Radius × 2, so at the placement radius the neighbouring circles are about a
diameter apart.
The two jobs can be separated. The drawn size is scaled per variant
(RadiusScaleInner to RadiusScaleOuter); the lattice is not. Sunflower
tapers its discs from 102% to 72% of the lattice step toward the rim, so the
seeds sit apart; Fibonacci shrinks them to 30% and links them, so each bead
marks a lattice point.
Near the very centre the packing breaks down in every variant — the first few
circles overlap heavily, because √i grows fastest there and the angle has not
had enough turns to separate them. It is the only place in the piece where the
packing fails, and it is what gives the middle its dense knot.
Six renderings
| Rendering | Circles | Radius | Scale | Mark | Ink |
|---|
| Gilded | 2000 | 6 | 1.45 | stroked outline, 1.25px | #E6C05F on #0d0b08 |
| Sunflower | 2800 | 7 | 1.05 | filled disc, tapering to 72% | #8A5220 → #F2C14E on #171008 |
| Currents | 2600 | 6 | 1.25 | 110° arc along the flow, fading outward | #A5DDE8 on #0a1420 |
| Fibonacci | 2200 | 6 | 1.40 | 30% beads, linked 34 indices apart | #5CB881 on #0b0e0a |
| Blueprint | 3600 | 4 | 1.60 | fine outline, 0.9px | #2C4A66 on #F3EEE2 |
| Ember | 2100 | 6 | 1.40 | jittered outline, fading outward | #F07A3A on #0c0503 |
Gilded is the piece itself: one ink, one size, uniform density. The other five
each change one structural decision and let the palette follow.
Sunflower fills the circles instead of outlining them, and ramps the ink from
seed-brown at the heart to gold at the rim, like the real head the geometry is
borrowed from. Currents draws only part of each circle — a 110° arc centred on
the direction of travel — so the disc becomes a field of commas streaming
along the spiral, bright at the eye and dissolving outward. Fibonacci draws
the arms themselves: a small bead at every lattice point, and a segment from
each point to the one 34 indices ahead — exactly the arm family the eye
assembles near the middle of the disc. Blueprint is the same disc on paper
instead of on black, finer and denser than the others. Ember perturbs every
point by up to a few pixels from a seeded stream and lets the rim fade, so the
exact lattice reads as a drift of sparks.
The disc’s natural radius is 2 × Radius × √CircleCount — about 537, 741, 612,
563, 480 and 550 units for the six renderings above — so the lattices differ in
scale as well as in structure, and left alone they would float in the frame to
very different degrees. Each rendering therefore carries a Scale: a uniform
zoom about the centre, chosen so the outermost mark ends the same ~112–132
pixels from the frame edge in all six. The renderings differ in structure, not
in how deliberately they fill the canvas.
The framed piece
The seventh gallery plate is the gilded disc hung as a finished work: mounted
inside an ivory mat behind a thin dark frame on a dark gallery wall, a soft
drop shadow lifting the frame off the wall. It is drawn by MuseumFrame, a
presentation layer that knows nothing about phyllotaxis — it draws any piece
directly into the mat opening, contain-fitted and clipped to it. The framed
plate is a way of showing the piece, not a family of new renderings: there is
exactly one, and the six variants are not copied into frames.
Determinism
Nothing is seeded because nothing is random — with one exception that is seeded
precisely so that it can be random. Every circle’s position is a closed-form
function of its index, computed in double and drawn in index order. Ember’s
jitter is drawn from SeededRandom(7), a PCG32 stream that produces the same
offsets on every run and every machine; the seed is a literal in the preset,
not a clock reading. Two runs produce identical output.