我想使用 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}