在 Tikz 中创建 Sierpinski 垫片的变体

在 Tikz 中创建 Sierpinski 垫片的变体

我想调整这里的例子来创建一个类似于谢尔宾斯基垫片的三角形: 如何在 LaTeX 中创建谢尔宾斯基三角形?

本质上,我想创建下图中垫圈的改变形式。即使只是分形的第一次迭代(从较大的三角形中移除 3 个三角形)也很棒!但是,我还没能弄清楚如何调整上面链接中的技术。任何帮助都将不胜感激!

帕斯卡三角形模型 3

答案1

欢迎!这是与您的图书馆屏幕截图相当接近的复制品lindenmayersystems

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{lindenmayersystems}
\begin{document}%
\def\trianglewidth{6cm}%

\pgfdeclarelindenmayersystem{Sierpinski triangle 3}{%
    \symbol{X}{\pgflsystemdrawforward}%
    \rule{X -> X-X+X+X-X-XX+X+X-X+X-X}%
}%
\pgfmathtruncatemacro{\level}{4}%
\tikzset{%
    l-system={step={\trianglewidth/pow(3,\level)}, order=\level, angle=-120}
}%
\begin{tikzpicture}
\fill [black] (0,0) -- ++(0:\trianglewidth) -- ++(120:\trianglewidth) -- cycle;
\clip (0,0) -- ++(0:\trianglewidth) -- ++(120:\trianglewidth) -- cycle;
    \draw [draw=none] (0,0) l-system
    [l-system={Sierpinski triangle 3,
    axiom=X},fill=white,draw,line width=1pt/\level,line join=round];
\end{tikzpicture}
\end{document}

在此处输入图片描述

现在让我们讨论如何实现这一点。首先,我认为您链接的帖子可以简化。据我所知,这条规则是没有必要的Y。这一观察也允许人们概括这一构造。

\documentclass[border=5mm]{standalone}
\usepackage{tikz}

\usetikzlibrary{lindenmayersystems,backgrounds}

\begin{document}%
\def\trianglewidth{2cm}%
\pgfdeclarelindenmayersystem{Sierpinski triangle}{
    \symbol{X}{\pgflsystemdrawforward}
    \rule{X -> X-X+X+X-X}
}%
\foreach \level in {0,...,3}{%
\tikzset{
    l-system={step=\trianglewidth/(2^\level), order=\level, angle=-120}
}%
\begin{tikzpicture}
    \fill [black] (0,0) -- ++(0:\trianglewidth) -- ++(120:\trianglewidth) -- cycle;
    \draw [draw=none] (0,0) l-system
    [l-system={Sierpinski triangle, axiom=X},fill=white];
\end{tikzpicture}
}%

\pgfdeclarelindenmayersystem{Sierpinski triangle 3}{
    \symbol{X}{\pgflsystemdrawforward}
    \rule{X -> X-X+X+X-X-XX+X+X-X+X-X}
}%
\foreach \level in {1,...,4}{%
\tikzset{
    l-system={step={\trianglewidth/pow(3,\level)}, order=\level, angle=-120}
}%
\begin{tikzpicture}[background rectangle/.style={fill=blue},
show background rectangle]
\fill [black] (0,0) -- ++(0:\trianglewidth) -- ++(120:\trianglewidth) -- cycle;
    \draw [draw=none] (0,0) l-system
    [l-system={Sierpinski triangle 3, axiom=X},fill=white];
\end{tikzpicture}}
\end{document}

常规谢尔宾斯基三角形得到再现:

在此处输入图片描述

这里绘制的新内容带有背景,以表明没有作弊行为,即没有用白色绘制不必要的东西。

在此处输入图片描述

这是一个“仅限新内容”的无背景版本。

\documentclass[border=5mm]{standalone}
\usepackage{tikz}

\usetikzlibrary{lindenmayersystems}

\begin{document}%
\def\trianglewidth{3cm}%

\pgfdeclarelindenmayersystem{Sierpinski triangle 3}{
    \symbol{X}{\pgflsystemdrawforward}
    \rule{X -> X-X+X+X-X-XX+X+X-X+X-X}
}%
\foreach \level in {1,...,3}{%
\tikzset{
    l-system={step={\trianglewidth/pow(3,\level)}, order=\level, angle=-120}
}%
\begin{tikzpicture}
\fill [black] (0,0) -- ++(0:\trianglewidth) -- ++(120:\trianglewidth) -- cycle;
    \draw [draw=none] (0,0) l-system
    [l-system={Sierpinski triangle 3, axiom=X},fill=white];
\end{tikzpicture}}
\end{document}

在此处输入图片描述

为了获得更类似于屏幕截图的效果,我们可以添加线宽。

\documentclass[border=5mm]{standalone}
\usepackage{tikz}

\usetikzlibrary{lindenmayersystems}

\begin{document}%
\def\trianglewidth{3cm}%

\pgfdeclarelindenmayersystem{Sierpinski triangle 3}{
    \symbol{X}{\pgflsystemdrawforward}
    \rule{X -> X-X+X+X-X-XX+X+X-X+X-X}
}%
\foreach \level in {1,...,3}{%
\tikzset{
    l-system={step={\trianglewidth/pow(3,\level)}, order=\level, angle=-120}
}%
\ifnum\level>1
~
\fi
\begin{tikzpicture}
\fill [black] (0,0) -- ++(0:\trianglewidth) -- ++(120:\trianglewidth) -- cycle;
\clip (0,0) -- ++(0:\trianglewidth) -- ++(120:\trianglewidth) -- cycle;
    \draw [draw=none] (0,0) l-system
    [l-system={Sierpinski triangle 3,
    axiom=X},fill=white,draw,line width=1pt/\level,line join=round];
\end{tikzpicture}}
\end{document}

在此处输入图片描述

如果您好奇这里发生了什么:想象一下您是一只乌龟,沿着某条路径爬行。只要有X,就意味着您爬行了一段距离,如果有+,您就会转弯-120(为什么-120?因为杰克这么说,与猫头鹰争论不是一个好主意;-)如果有,-您逐渐转弯120。还有另一个库可以让我们说明这一点(只需搜索并用相应的键替换X+和)。-turtle

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{turtle}
\newcounter{iturt}
\begin{document}
\begin{tikzpicture}[scale=2,
pics/arrow/.style={code={\draw[-latex] (-0.5,0) -- (0,0);}}]
\draw [turtle={how/.style={to path={-- (\tikztotarget)
node[pos=0.7,auto]{\stepcounter{iturt}\number\value{iturt}}
pic[pos=1,sloped,allow upside down]{arrow}}},
home,right=90,forward,right=-120,forward,left=-120,forward,left=-120,forward,right=-120,forward,right=-120,forward,forward,left=-120,forward,left=-120,forward,right=-120,forward,left=-120,forward,right=-120,forward}];
\end{tikzpicture}
\end{document}

在此处输入图片描述

也可以使用parser模块,也许这更简单,但底线是 TiZ 拥有可以让人直观地了解这里发生的事情的工具。

相关内容