如何在 LaTeX 中绘制由圆圈组成的“半色调”螺旋?

如何在 LaTeX 中绘制由圆圈组成的“半色调”螺旋?

我想使用 LaTeX 绘制如下的螺旋线,但这超出了我的能力范围。任何帮助都将不胜感激。 原始图像

新编辑:现在具有更好的 3D 外观!)在尝试了 Jasper Habicht 的解决方案后,这是我目前能得到的最好的解决方案。我非常高兴。谢谢!

螺旋最终

我对 Jasper Habicht 解决方案的定制版本!(给他投“赞成”票!)

% Credits to Jasper Habicht (See below)
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}

\begin{document}
  
\definecolor{mygreencolor}{RGB}{133,196,96}  

\begin{tikzpicture}

\pgfmathsetmacro\maxradius{.3}
\pgfmathsetmacro\inner{10}
\pgfmathsetmacro\outer{40}
\pgfmathsetmacro\range{\outer-\inner}

\foreach \stepy in {\inner, ..., \outer}
    \pgfmathsetmacro\stepstart{60/\stepy}
    \pgfmathsetmacro\steplast{360-\stepstart}
    \pgfmathsetmacro\stepcount{floor(360/\stepstart)} 
    \foreach \stepx in {0, \stepstart, ..., \steplast}
        \pgfmathsetmacro\stepsingle{floor(\stepx/\stepstart)}
        \pgfmathsetmacro\stepradius{(\maxradius/2)*sin(deg(\stepsingle*pi/(\stepcount/2) - pi - (\stepy/5))) + (\maxradius/2)+0.13}
        \pgfmathsetmacro\mybase{90*(\stepy-\inner)/\range)}
        \pgfmathsetmacro\mycoef{((1-cos(\mybase)+sin(\mybase))/2}
        \pgfmathsetmacro\mystepy{\inner+\range*\mycoef}
        \fill[mygreencolor] ({-(\stepx+.25*\stepcount)}:-\mystepy mm) circle (\stepradius mm);

\end{tikzpicture}

\end{document}

答案1

不同的方法也需要大量的微调。

它的作用是什么?它会绘制由不同数量的小圆组成的多个环,并随着环半径的增大而增加小圆的数量,以使小圆的分布最终相对均匀。小圆的半径是使用正弦波函数计算的,该函数在半径为零和 0.5 毫米之间变换。正弦波也会针对每个环进行偏移,以产生螺旋效果。

\documentclass[tikz]{standalone}
\usetikzlibrary{calc}

\begin{document}

\begin{tikzpicture}

\pgfmathsetmacro\maxradius{.5}

\foreach \stepy in {10, ..., 30}
    \pgfmathsetmacro\stepstart{60/\stepy}
    \pgfmathsetmacro\steplast{360-\stepstart}
    \pgfmathsetmacro\stepcount{floor(360/\stepstart)}
    \foreach \stepx in {0, \stepstart, ..., \steplast}
        \pgfmathsetmacro\stepsingle{floor(\stepx/\stepstart)}
        \pgfmathsetmacro\stepradius{(\maxradius/2)*cos(deg(\stepsingle*pi/(\stepcount/2) - pi - (\stepy/5))) + (\maxradius/2)}
        \fill[green] (\stepx:\stepy mm) circle (\stepradius mm);

\end{tikzpicture}

\end{document}

在此处输入图片描述


经过编辑,使其具有更多的 3D 效果:

\documentclass[tikz]{standalone}
\usetikzlibrary{calc}

\begin{document}

\begin{tikzpicture}

\pgfmathsetmacro\maxradius{.5}

\foreach \stepy in {10, ..., 30}
    \pgfmathsetmacro\stepstart{60/\stepy}
    \pgfmathsetmacro\steplast{360-\stepstart}
    \pgfmathsetmacro\stepcount{floor(360/\stepstart)}
    \foreach \stepx in {0, \stepstart, ..., \steplast}
        \pgfmathsetmacro\stepsingle{floor(\stepx/\stepstart)}
        \pgfmathsetmacro\stepradius{(\maxradius/2)*cos(deg(\stepsingle*pi/(\stepcount/2) - pi - (\stepy/5))) + (\maxradius/2)}
        \fill[green] ({\stepx+.25*\stepcount}:\stepy mm) circle (\stepradius mm);

\end{tikzpicture}

\end{document}

在此处输入图片描述

原图中内圈的圆比较小,而且距离比较近,我想这个效果应该不难实现吧。

答案2

这是一个简短的例子,可能需要进行一些调整。我添加了一个注释螺旋,用作参考。

\documentclass[tikz, border=2mm]{standalone}

\begin{document}
\begin{tikzpicture}[line cap=round]
  \foreach\a in {0,2,...,359}       % angle to put each cricle (polar coordinates)
  {
    \pgfmathsetmacro\s{2.5+\a/90}   % theoretical point of the spiral (radius, polar coordinates)
    \foreach\r in {2.5,2.6,...,6.5} % radius to put each circle (polar coordinates)
    {
      \pgfmathsetmacro\w{0.1+0.5/(1+abs(\s-\r))} % width of the circles
      \fill[green] (\a:\r) circle (\w mm);
    }
    % Reference spiral:
    %\fill (\a:\s) circle (0.05);
  }
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容