使用 tikz 实现模块化图形的代码经济

使用 tikz 实现模块化图形的代码经济

我正在尝试使用 tikz 创建类似于以下捕获的图形,该图形是使用 CAD 程序制作的: 在此处输入图片描述 这是 tikz 代码的片段:

% Modular figure with tikz. By Jesús Álvarez Lobo ________________
    \documentclass[10pt]{article}
    \usepackage{tikz}
    \usepackage{graphicx, subfig}
    \usepackage{floatrow}   
    \usepackage{pgfplots}
    \pgfplotsset{compat=1.15}
    \pagestyle{empty}
    \begin{document}
        \pagestyle{empty}
        \begin{tikzpicture}[scale=.05, line width=1pt]
            \draw[fill=gray!25, fill opacity=0.5]  (0,0) circle (16);
            \draw(0, 16) -- (0,48);
            \draw [fill=gray!25, fill opacity=0.5](0,56) circle (8);
            \draw(0, 64) -- (0,80);
            \draw(8, 56) -- (24,56);
            \draw(-8, 56) -- (-24,56);      
            \draw [fill=gray!25, fill opacity=0.5](0,84) circle (4);
            \draw [fill=gray!25, fill opacity=0.5](28,56) circle (4);
            \draw [fill=gray!25, fill opacity=0.5](-28,56) circle (4);
            \draw(0, 88) -- (0,96);
            \draw [fill=gray!25, fill opacity=0.5](0,98) circle (2);
            \draw(0, 100) -- (0,104);
            \draw[fill=gray!25, fill opacity=0.5] (0,105) circle (1);
            \draw(0, 106) -- (0,108);
            \draw(-1, 105) -- (-3,105);
            \draw(1, 105) -- (3,105);       
        \end{tikzpicture}
    \end{document}

在此处输入图片描述

从技术上讲,我完全可以胜任 tikz 的绘图工作;我问自己的是如何利用图形的模块化获得代码经济。很容易看出,通过重复以下子图、将其放置在适当的位置、必要时旋转并缩放,可以构建整个树。这些生成模块在树中的每次迭代中的比例均为 .5。

% Modular figure with tikz. By Jesús Álvarez Lobo ________________
\documentclass[10pt]{article}
\usepackage{tikz}
\usepackage{graphicx, subfig}
\usepackage{floatrow}   
\usepackage{pgfplots}
\pgfplotsset{compat=1.15}
\pagestyle{empty}
\begin{document}
    \pagestyle{empty}
    \begin{tikzpicture}[scale=.05, line width=1pt]
        \draw(0, 16) -- (0,48);
        \draw [fill=gray!25, fill opacity=0.5](0,56) circle (8);
        \draw(0, 64) -- (0,80);
        \draw(8, 56) -- (24,56);
        \draw(-8, 56) -- (-24,56);      
        \draw [fill=gray!25, fill opacity=0.5](0,84) circle (4);
        \draw [fill=gray!25, fill opacity=0.5](28,56) circle (4);
        \draw [fill=gray!25, fill opacity=0.5](-28,56) circle (4);  
    \end{tikzpicture}
\end{document}

在此处输入图片描述

与捕获的图像不同,没有使用任何颜色(仅灰度)并且圆圈是单线,而不是环)。

答案1

这是我的尝试:

首先定义一些命令。

\newcommand{\module}{%
    \draw(0, 16) -- (0,48);
    \draw [fill=gray!25, fill opacity=0.5](0,56) circle (8);
    \draw(0, 64) -- (0,80);
    \draw(8, 56) -- (24,56);
    \draw(-8, 56) -- (-24,56);      
    \draw [fill=gray!12.5](0,84) circle (4);
    \draw [fill=gray!12.5](28,56) circle (4);
    \draw [fill=gray!12.5](-28,56) circle (4);
}

这是问题中提供的代码

\newcommand{\fourFoldSymmetry}[1]{%
    {#1}
    \begin{scope}[rotate=90]
        {#1}
        \begin{scope}[rotate=90]
            {#1}
        \begin{scope}[rotate=90]
            {#1}
        \end{scope}
        \end{scope}
    \end{scope}
}

这会在圆圈里重复四次

\newcommand{\threeFoldSymmetryULR}[1]{%
{#1}
\begin{scope}[xshift=56cm, yshift=-56cm, rotate around={-90:(0, 56)}]
    {#1}
    \end{scope}
    \begin{scope}[xshift=-56cm, yshift=-56cm, rotate around={90:(0, 56)}]
        {#1}
    \end{scope}
}
\newcommand{\threeFoldSymmetryURD}[1]{%
    \begin{scope}[rotate=-90]
        \threeFoldSymmetryULR{#1}
    \end{scope}
}
\newcommand{\threeFoldSymmetryULD}[1]{%
    \begin{scope}[rotate=90]
        \threeFoldSymmetryULR{#1}
    \end{scope}
}

这些按照指示的方向重复三次,分别表示U上、L左、D下、R右。

然后可以绘制如下图所示:

\begin{document}
    \pagestyle{empty}
    \begin{tikzpicture}[scale=.05, line width=1pt]
        % Draw the centre circle
        \draw [fill=gray!25, fill opacity=0.5] (0, 0) circle (16);
        % Everything is rotated four times
        \fourFoldSymmetry{
        \module  % Inner layer
        % Move up to next layer and then scale by 0.5
        \begin{scope}[yshift=56cm, scale=0.5]  
            \threeFoldSymmetryULR{\module}
            \begin{scope}[xshift=56cm, scale=0.5]
                \threeFoldSymmetryURD{\module}
            \end{scope}
            \begin{scope}[xshift=-56cm, scale=0.5]
                \threeFoldSymmetryULD{\module}
            \end{scope}
            \begin{scope}[yshift=56cm, scale=0.5]
                \threeFoldSymmetryULR{\module}
            \end{scope}
        \end{scope}
        }
    \end{tikzpicture}
\end{document}

我相信有更智能的方法可以做到这一点,我只是计算出每次需要多少移位,但如果你想要更大的递归深度,这将是一个问题。另外,我认为你可能要考虑一下你使用什么作为基础模块。请注意,我删除了不透明度,而是改为gray!25实现gray!12.5相同的颜色。这是因为我有重叠的圆圈,因为我认为更直观的基础是一个大圆圈和从它上面出来的三个小圆圈。还有一些棍棒重叠,这会使一些 pdf 查看器显示的部分比实际更厚。 要求的数字

相关内容