我想要绘制下图:
SebGlav
来自的接受答案这个帖子给出了一些代码。
代码(归功于SebGlav):
\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{calc}
\begin{document}
\newcommand{\RadiusA}{8} %Define the radius of big-boundary circle
\pgfmathsetmacro{\RadiusB}{\RadiusA/(1+2/sqrt(3))}
\begin{tikzpicture}
\draw[] (0,0) circle[radius=\RadiusA cm];
\foreach \ang [count = \i from 1] in {90,210,330}
\draw[] (\ang:\RadiusA-\RadiusB) coordinate (center-\i) circle[radius=\RadiusB cm];
\pgfmathsetmacro{\RadiusC}{\RadiusB/(1+2/sqrt(3))}
\foreach \i in {1,2,3}
\foreach \ang in {90,210,330}
\draw[] ($(center-\i)+(\ang:\RadiusB-\RadiusC)$) circle[radius=\RadiusC cm];
% Divide each small circle into 3 equal circles
\foreach \i in {1,2,3}
\foreach \ang in {90,210,330}
\foreach \j in {0,1,2}
\draw[] ($(center-\i)+(\ang:\RadiusB-\RadiusC)+(120*\j:\RadiusB/3)$) circle[radius=\RadiusB/6];
%this is the main governng equation for small circles
\end{tikzpicture}
\end{document}
绘制了下图:
但上图可以通过改进最后一个控制方程得到进一步改进
\draw[] ($(center-\i)+(\ang:\RadiusB-\RadiusC)+(120*\j:\RadiusB/5)$) circle[radius=\RadiusB/7];
如下:
后面的图好多了,但仍然不是我想要的。我们需要确保三个小圆圈相互接触,就像我上面问题中的图片一样。
我认为我们必须调整代码末尾的主要控制方程。我很感激大家的建议。
答案1
解决此问题的方法可以是:
- 计算圆的较大半径与较小半径之间的比率,恰好是
1/(1+(2/sqrt(3)))
。 - 定义一个函数以简化代码中的内容。
- 重复并将函数粘贴在其内部以形成更小的圆圈。
应该可以通过自引用(递归)代码进一步简化这一点,但我保留原样以使方法更加清晰:
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[
declare function={
sr(\r) = \r/(1+2/sqrt(3));
}
]
\draw (0:0) circle[radius=5];
\foreach \a in {90,210,330} {
\draw (\a:{5-sr(5)}) circle[radius={sr(5)}];
\begin{scope}[shift={(\a:{5-sr(5)})}]
\foreach \a in {90,210,330} {
\draw (\a:{sr(5)-sr(sr(5))}) circle[radius={sr(sr(5))}];
\begin{scope}[shift={(\a:{sr(5)-sr(sr(5))})}]
\foreach \a in {90,210,330} {
\draw (\a:{sr(sr(5))-sr(sr(sr(5)))}) circle[radius={sr(sr(sr(5)))}];
}
\end{scope}
}
\end{scope}
}
\end{tikzpicture}
\end{document}
如上所述,可以在此处创建一个递归函数(感谢 Qrrbrbirlbel 的输入):
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[
declare function={
sr(\r,\i) = \r/((1+2/sqrt(3))^\i);
}
]
\draw (0:0) circle[radius=5];
\NewDocumentCommand{\DrawThreeCircles}{ m O{0:0} O{0} m }{
\begin{scope}[shift={(#2)}]
\foreach \a in {90,210,330} {
\draw (\a:{sr(#1,#3)-sr(#1,{#3+1})}) circle[radius={sr(#1,{#3+1})}];
\ifnum#3<#4
\pgfmathtruncatemacro{\x}{#3}
\pgfmathtruncatemacro{\y}{#3+1}
\DrawThreeCircles{#1}[\a:{sr(#1,\x)-sr(#1,\y)}][\y]{#4}
\fi
}
\end{scope}
}
% first argument: radius of largest circle
% second argument: number of iterations
\DrawThreeCircles{5}{3}
\end{tikzpicture}
\end{document}