如何使用 PGF/TikZ 将一个圆分成三个相等的圆?

如何使用 PGF/TikZ 将一个圆分成三个相等的圆?

我想要绘制下图:

在此处输入图片描述

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}

在此处输入图片描述

相关内容