我想调整这里的例子来创建一个类似于谢尔宾斯基垫片的三角形: 如何在 LaTeX 中创建谢尔宾斯基三角形?
本质上,我想创建下图中垫圈的改变形式。即使只是分形的第一次迭代(从较大的三角形中移除 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
模块,也许这更简单,但底线是 Ti钾Z 拥有可以让人直观地了解这里发生的事情的工具。