TikZ:尝试绘制叶序(向日葵图案)并因计算限制而缩短

TikZ:尝试绘制叶序(向日葵图案)并因计算限制而缩短

正如标题所述,我正在尝试使用 TikZ 绘制向日葵图案。我的实验基于以下信息:本教程由 Jim Bumgardner 编写,主要来自示例8和10。

他的演示使用了 javascript,我已经将其改编为 python 来生成 svg,但这次我需要以 cmyk 格式生成可打印的文档,因此我尝试使用 TikZ。

我使用下面显示的代码没有问题,但我的问题是我无法绘制包含更多圆圈的图案。当我尝试使用更大的“nbrcircles”值对其进行编译时,我收到错误“尺寸太大”。在尽可能多地阅读后,我了解到此错误与 TikZ 系统的计算限制有关。

我对 TikZ 世界(甚至对 Tex 世界)还很陌生,我正在寻找一种方法来绘制更大的图案,如上面链接的页面所示。

任何帮助将不胜感激。

这是我目前拥有的工作代码。只需将 nbrcircles 的值替换为更大的数字即可产生错误:

\documentclass[10pt]{minimal}

\usepackage{tikz}

\begin{document}
\pagestyle{empty}

\def \nbrcircles {28}
\def \outerradius {15mm}
\def \dotradius {1.5mm}

\begin{tikzpicture}
\pgfmathsetmacro {\goldenAngle} {180 * (1+sqrt(5))}
\foreach \b in {1,...,\nbrcircles}{
    \pgfmathsetmacro{\angle} {\goldenAngle * \b}
    \pgfmathsetmacro{\sradius}{\b / \nbrcircles * \outerradius / 10}
    \draw[] (\angle:\sradius) circle [radius=\dotradius] ;
}  
\end{tikzpicture}
\end{document}

这是我使用该代码得到的结果。将其与示例 #8 进行比较吉姆的页面,你会发现我漏掉了几个点:-) :

需要更多种子的叶序

理想情况下,我希望能够制作一个包含 300 到 600 颗种子的图案,并且能够随着螺旋的发展而增加圆的大小(就像 Jim 的示例 10 一样)。

答案1

\angle代码中的问题来自于以下行的计算:

\pgfmathsetmacro{\angle} {\goldenAngle * \b}

\b大于 28 时,该乘积的结果将大于 16384,这是允许的最大值。您应该重构代码以避免计算此类值。

在此代码中执行此操作的一种方法是计算相同的角度模数360. 尝试以下操作:

\begin{tikzpicture}
\pgfmathsetmacro {\goldenRatio} {(1+sqrt(5))}
\foreach \b in {1,...,\nbrcircles}{
    \pgfmathsetmacro{\angle}{mod(\goldenRatio * \b,2)*180}
    \pgfmathsetmacro{\sradius}{\b / \nbrcircles * \outerradius / 10}
    \draw[] (\angle:\sradius) circle [radius=\dotradius] ;
}  
\end{tikzpicture}

您可以看到,我们现在\b仅乘以1+sqrt(5),然后在乘以 180 之前使用模数运算。这将产生与之前代码相同的结果,但允许 更大的值\b。例如,查看\nbrcircles设置为 1000 的渲染:

1000 点

答案2

\documentclass[tikz,border=2cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin {tikzpicture}
\foreach \x in {0,...,1000}{
    \fill ({mod((1+sqrt(5))*\x,2)*180}:{0.1+sqrt(\x/pi)/2}) circle [radius=0.15];
}
\end{tikzpicture}
\end{document}

相关内容