This is an adaptation of a Processing.js example originally written by Jim Bumgardner.
His tutorial entitled "Circles, Spirals and Sunflowers" can be found here: http://krazydad.com/tutorials/circles_js/
Following code adapts Jim's example #10.
Credit also goes to TonioElGringo on stackexchange, for the help he provided here: http://tex.stackexchange.com/questions/192028/
Edit and compile if you like:
% Phyllotaxy % Author: David Convent \documentclass[tikz,border=10pt]{standalone} \usetikzlibrary{calc} \def\nbrcircles {377} \def\outerradius {30mm} \def\deviation {.9} \def\fudge {.62} \newcounter{cumulArea} \setcounter{cumulArea}{0} \begin{document} \begin{tikzpicture}[scale=.32] \pgfmathsetmacro {\goldenRatio} {(1+sqrt(5))} \pgfmathsetmacro {\meanArea} {pow(\outerradius * 10 / \nbrcircles, 2) * pi} \pgfmathsetmacro {\minArea} {\meanArea * (1 - \deviation)} \pgfmathsetmacro {\midArea} {\meanArea * (1 + \deviation) - \minArea} \foreach \b in {0,...,\nbrcircles}{ % mod() must be used in order to calculate the right angle. % otherwise, when \b is greater than 28 the angle is greater % than 16384 and an error is raised ('Dimension too large'). % -- thx Tonio for this one. \pgfmathsetmacro{\angle}{mod(\goldenRatio * \b, 2) * 180} \pgfmathsetmacro{\sratio}{\b / \nbrcircles} \pgfmathsetmacro{\smArea}{\minArea + \sratio * \midArea} \pgfmathsetmacro{\smRadius}{sqrt(\smArea / pi) / 2 * \fudge} \addtocounter{cumulArea}{\smArea}; \pgfmathparse{sqrt(\value{cumulArea} / pi) / 2} \fill[] (\angle:\pgfmathresult) circle [radius=\smRadius] ; } \end{tikzpicture} \end{document}
Click to download: phyllotaxy.tex • phyllotaxy.pdf
Open in Overleaf: phyllotaxy.tex