Recovering the angle from the counts
Worth reading first: Counting the spirals.
A generator that only ever runs forwards proves nothing about itself. Feed it an angle, get a pattern; the pattern looks like a sunflower; there is no way to tell from it whether the machinery did what it claimed.
So the machinery runs backwards as well. A head is built at a stated angle, the angle is set aside, and a second piece of code — which has never been shown it — is handed the spiral counts and asked which divergence angle produces them.
It gets the angle back to about a hundredth of a degree.
The relation it uses
The recovery rests on one piece of lattice geometry.
In a Vogel head the point i sits at radius √i, so stepping j places back moves a point by two things at once. Around the disc it moves by the fractional part of j·δ turns, which is an arc of 2πr times that fraction. Outward it moves by roughly j/2r in model units, because the radius is a square root.
The hop for offset j is the hypotenuse of those two, and the parastichy numbers are the offsets with the shortest hops. So given observed counts m and n at a known radius, the recovery asks: for which divergence angles are m and n among the shortest? That has a genuine interval of solutions, and the centre of the interval is the answer.
Both quantities the relation needs are read off the point set rather than taken from the model. The radius is the middle of the band that was counted. The scale comes from the density, since Vogel’s model puts an equal area around every point.
The cost function that had no geometry in it
The first version scored candidate angles by how nearly m·δ and n·δ landed on whole turns, without the radial term.
It was minimised at δ ≈ 0. At zero every multiple is a whole number of turns, so the score is perfect — and the “lattice” is a single radial line with every point on top of every other. The recovery confidently returned 0.0018° for a golden-angle head.
The mistake is worth naming because it is a common shape. The angular condition is necessary for an offset to be a parastichy number and it is not sufficient: the offset also has to be small enough that the radial hop does not dominate. Leaving out the term that grows with j left a cost function whose minimum was a degenerate configuration, and degenerate configurations are exactly where an incomplete cost function goes.
Adding the radial term fixes it, and it fixes it for a reason rather than by tuning: the term is not a penalty introduced to avoid a bad answer, it is the second component of a distance that was always there.
When the recovery refuses
Two cases, and both are informative rather than annoying.
Non-coprime counts. If the two counts share a factor, no single divergence angle is recoverable. That is not a failure — it means the pattern is whorled rather than spiral. A divergence angle near a simple fraction of a turn produces radial rows, and a head at 137.0° counts as 21 and 42, because 137.0 is within a whisker of 960/7. Twenty-one and forty-two share a factor of 21, and what the pattern really is is seven rows of something. The recovery says so and stops.
No consistent angle. If the counts cannot both be among the shortest offsets at that radius for any angle, the recovery refuses. That is what caught the counter returning the two smallest offsets rather than the two shortest — fed 21 and 34 at a radius where the true neighbours are 34 and 55, no angle works, and the refusal was the only signal that anything was wrong.
The interval, and why it is reported
The recovery returns a width as well as a centre, and the width matters.
Two small counts constrain the angle loosely; two large ones constrain it tightly. A pair like 8 and 13 pins the angle to within a degree or so; a pair like 55 and 89 pins it to a few hundredths. That is a real property of the problem — a coarse pattern carries less information about its generating angle than a fine one — and reporting a single number without it would overstate what a count can say.
It also sets a limit on what any measurement of a real plant can establish. A pine cone with 8 and 13 parastichies is consistent with a range of divergence angles a degree wide, and no amount of care in counting narrows it. Distinguishing 137.5° from 137.9° needs a head with high counts, which means a large one.
What the round trip proves
The agreement is to about a hundredth of a degree across four quite different angles, and it is worth being precise about what that establishes.
It proves the forward generator and the backward recovery are consistent, which is a real thing to have proved. A sign error in the lattice geometry, a confusion between turns and degrees, or an off-by-one in the birth order would all break it, and every one of those leaves a pattern that looks exactly like a pattern.
It does not prove that Vogel’s model describes any plant. Two consistent implementations of the same wrong idea agree perfectly. That is why the site carries checks that come at the geometry from other directions — the counter shown to find rows in a rational lattice, the packing measured against several criteria that disagree, the angle produced by a dynamical model that was never told it.
And it does not prove anything about a photograph. Recovering an angle from a real head would need the counts, the radius they were taken at, and the model’s scale, and real heads are noisy in all three.
The same shape, three times over
This is the third instance of a pattern that has appeared here often enough to be worth naming.
Generate something from a stated parameter. Forget the parameter. Recover it by a computation shaped differently from the one that made it, with the original hidden behind an interface narrow enough to inspect. Compare.
A crystallography site generates a pattern, forgets which symmetry group produced it, and rediscovers the group. A perspective site draws a box from a camera and recovers the camera’s focal length from the drawn edges. Here a head is built from an angle and the angle comes back out of the spiral counts.
In each case the value is not in the forward computation, which is easy. It is in the fact that a second computation with a different shape had to arrive at the same answer with the first one’s workings hidden — and in each case the round trip found a bug that nothing else did.
What it costs
Very little, which is worth saying because the case for round trips is usually made on principle rather than on price.
The forward generator is two lines of trigonometry. The recovery is a scan over candidate angles with a hypotenuse at each, and it runs in a few milliseconds. Both run on every figure that uses them, so a change to the lattice geometry that breaks the correspondence stops the figure being drawn at all rather than producing one that is wrong in a way nobody can see.
That is the argument in one sentence. The failure being guarded against is not a crash; it is a pattern that looks entirely convincing and was generated by a rule with a bug in it, which is the ordinary condition of illustrations in this subject.
What the recovery returns when it should refuse
A measurement that always produces a number is not a measurement, so the recovery is built to decline.
Handed a pair of counts that no divergence angle can produce at the stated radius, it returns nothing rather than the least-bad candidate. The commonest such input is a non-coprime pair — 34 and 68, say. Parastichy numbers of a genuine lattice are coprime, because a common factor means the two families do not generate the lattice and the pattern would have a symmetry that a spiral head does not have. Fed 34 and 68, the recovery declines.
That behaviour is not decoration. It is what caught the worst bug this site’s machinery has had.
The bug the refusal caught
The spiral counter originally returned the two smallest offsets that were local minima, rather than the two shortest hops. On a head whose true neighbours at the counting radius are 34 and 55, it returned 21 and 34.
Nothing about the picture revealed this. The figure drew twenty-one spirals and there were twenty-one of them; the count matched the drawing, because the drawing was made from the count. Every visual check passed. Both numbers are Fibonacci numbers, which is what one expects to see, so even a suspicious reader would have nodded.
The recovery caught it by refusing. Asked which divergence angle makes 21 and 34 the shortest offsets at that radius, it found none — because at that radius they are not, and 21 has been superseded. The failure was not a wrong number; it was a declined answer where an answer was expected, which is a much louder signal.
The general form of this is worth naming, since it recurs across this site’s tools. A forward generator and a backward recovery share no code, so a bug in one shows up as a disagreement rather than as a consistent wrong answer. And a recovery that can refuse turns “disagreement” into something that cannot be read as noise.
The interval, and why the centre of it
The recovery does not return a point. It returns an interval: the set of divergence angles for which the given offsets are the two shortest at the given radius, which is a genuine range because a lattice is stable under small changes of angle.
The reported value is the centre. That is a choice, and it is defensible for a reason worth stating: the interval is where the counts are consistent with the angle, and its centre is where they are most robustly so — the angle furthest from any nearby value where the counts would change.
The width of the interval is the uncertainty of the measurement, and it shrinks as the counting radius grows, because higher offsets pin the angle more tightly. That is the same effect as the counts changing with radius, read as a statement about precision: counting at the rim of a large head gives a better estimate of the angle than counting near the middle, and the improvement is computable in advance.
Reading it back onto real material
The recovery’s practical use is that it turns a photograph into a number.
Given a picture of a seed head, one can count spirals in an annulus, measure the annulus radius as a fraction of the head radius, and estimate the number of primordia from the density. Those three inputs are what the recovery needs, and they are all obtainable with a printed image and patience.
What comes back is a divergence angle with an uncertainty, which is a far more useful description of the plant than a pair of counts — because the angle is the model’s output and the counts are a radius-dependent consequence of it.
It also makes the interesting question askable. A plant on the Lucas branch has an angle near 99.5° and counts of 47 and 76, and someone who only ever records counts will file that as an anomaly. Someone who recovers the angle will notice it is a second attractor of the same model, which is a different sort of fact.
What round-tripping is worth, generally
The pattern this essay demonstrates is the site’s main methodological commitment, and it generalises past divergence angles.
Take a model that turns a parameter into a form. Build the form, discard the parameter, and recover it with independent code. Three things become true that were not true before.
A bug produces a disagreement rather than a consistent wrong answer, because two independent implementations rarely fail the same way.
A check can refuse, which is a much louder signal than a wrong number, and is what caught the counter’s error.
And the claim becomes about the data, since the recovery sees only what a reader could see — coordinates, counts, radii — and not the model’s internals.
The growth-factor fit, the exponent fit and the spiral counter are all the same construction, and where a site has no round trip available it is worth saying so rather than letting a forward generator’s output pass as evidence about itself.
The inputs, and how much each one matters
Since the recovery is meant to be usable on real material, the sensitivity to each input is worth stating.
The counts matter most and are the easiest to get wrong, because a miscount by one selects a different offset entirely and the recovery will either return a distinctly different angle or refuse. That is a good failure mode: a wrong count rarely produces a plausible wrong angle.
The radius matters moderately. It enters through the lattice chord, and a ten per cent error in the counting band’s radius shifts the recovered angle by a small fraction of the interval width — enough to widen the uncertainty, not enough to change the answer.
The point count matters least, since it only sets the scale through the density and Vogel’s model gives every point equal area. An estimate within a factor of two is sufficient.
So the practical advice is: count carefully, measure the radius roughly, and estimate the total loosely. That ordering is not obvious in advance and it is the sort of thing a sensitivity check produces and intuition does not.
The same problem on a cylinder, where it closes
Expansion built the cylindrical version of this recovery, and the comparison says something about why this one returns an interval.
On a stem, two counts and two hop lengths determine the lattice exactly: the divergence and the rise come back with residuals around 10⁻¹³, which is the floating-point floor rather than a tolerance that was met.
The extra information is the hop lengths. On a cylinder the lattice is genuinely periodic, so the distance between node i and node i+m is the same everywhere on the stem and its median is that number. On a disc the same hop is longer near the centre than at the rim, so its median across a counting band is an average over a changing quantity — which cannot be fed to an exact solver without producing an exact answer to a question nobody asked.
Narrowing the band until the lattice stops changing would fix that, and it cannot be done: a band narrow enough to freeze the lattice holds too few points to count in. The two requirements pull opposite ways on a disc and there is nothing to freeze on a cylinder.
So the interval here is not a shortfall in effort. It is what the geometry supplies, and the honest thing is to report its width — which is why the width is printed alongside the centre rather than left out.
How much a count constrains, without any recovery at all
This page recovers a divergence angle from counts and hop lengths. The work after it asked the weaker question — what the counts alone pin down, with no lengths, no radius and no recovery — and the answer has a law in it.
A reported pair leaves open a band of divergence angles about 221°/mn wide, where m and n are the two counts. Measured up the Fibonacci ladder: 38.85° for 2/3, 5.534° for 5/8, 0.811° for 13/21, 0.118° for 34/55, with the product width × mn coming out 233, 216, 221, 221, 221, 220, 221. The same constant appears on the Lucas pairs, which share no members.
So a bare count is not the weak evidence it looks like, provided the count is high. What this page’s machinery adds on top of that is the hop lengths, which close the recovery exactly on a cylinder — and the comparison shows where that exactness is worth having and where a count taken further out would have done.
What links here
Computed from the collection, not written here: the essays that point at this one.
Reads more easily once this is understood
Essays that name this one as worth reading first.
Shares its objects with
Essays that name at least two of the same things, and that neither author linked.
- The angle is not the object — both name branch, cylinder, divergence angle, fibonacci
- The second comb — both name cylinder, divergence angle, parastichy, round trip
- The survey this site cannot do — both name branch, cylinder, divergence angle, fibonacci
- A cone has a rise that falls — both name cylinder, divergence angle, parastichy
- Counting without an index — both name cylinder, parastichy, round trip
- Every family but two is a sum — both name fibonacci, parastichy, round trip
Named objects
A flat tag is an object no other essay names yet.
AnnulusBranchCoprimeCylinderDivergence angleFibonacciInterval estimateLattice chordParastichyRound tripWhorled pattern