我正在尝试绘制两个切点相交的谢尔宾斯基三角形。我的代码如下:
\documentclass[../main.tex]{subfiles}
\begin{document}
\begin{tikzpicture}[
main tri/.style={isosceles triangle, isosceles triangle apex angle=60, draw, anchor=apex, inner sep=0},
node distance=0mm,
minimum height=6cm
]
% Define recursive macro to create the Sierpinski triangle pattern
\newcommand\createsierpinski[3]{
\ifnum#3>0
% Calculate size for the smaller triangles
\pgfmathsetmacro{\newsize}{#1/2}
% Calculate the position for the next set of triangles
\path #2;
\pgfmathsetmacro{\newya}{\y-0.25*#1}
\pgfmathsetmacro{\newyb}{\y-0.75*#1}
% Draw the three smaller triangles
\createsierpinski{\newsize}{([yshift=-0.25*#1]#2)}{#3-1}
\createsierpinski{\newsize}{([yshift=-0.25*#1]#2.east)}{#3-1}
\createsierpinski{\newsize}{([yshift=-0.75*#1]#2.east)}{#3-1}
\fi
}
% First Sierpinski triangle
\node[main tri] (A) {};
\createsierpinski{6cm}{A}{4}
% Second Sierpinski triangle (rotated to touch at the tip)
\node[main tri, rotate=180] (B) at (A.apex) {};
\createsierpinski{6cm}{B}{4}
\end{tikzpicture}
\end{document}
答案1
这可能不是最优雅的解决方案,但是应该可行:
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}
\begin{document}
\begin{tikzpicture}[
main tri/.style={
isosceles triangle,
isosceles triangle apex angle=60,
draw,
anchor=apex,
inner sep=0pt
},
node distance=0mm,
minimum height=6cm,
]
% Define recursive macro to create the Sierpinski triangle pattern
\newcommand\createsierpinski[4][]{
\ifnum#4>0
% Calculate size for the smaller triangles
\pgfmathsetmacro{\newsize}{#2/2}
\node[main tri, #1, anchor=apex, minimum height={\newsize}]
(#3-1) at (#3.apex) {};
\node[main tri, #1, anchor=right corner, minimum height={\newsize}]
(#3-2) at (#3.right corner) {};
\node[main tri, #1, anchor=left corner, minimum height={\newsize}]
(#3-3) at (#3.left corner) {};
% Draw the three smaller triangles
\pgfmathtruncatemacro{\newi}{#4-1}
\begin{scope}
\createsierpinski[#1]{\newsize}{#3-1}{\newi}
\end{scope}
\begin{scope}
\createsierpinski[#1]{\newsize}{#3-2}{\newi}
\end{scope}
\begin{scope}
\createsierpinski[#1]{\newsize}{#3-3}{\newi}
\end{scope}
\fi
}
\pgfmathsetmacro{\y}{1}
% First Sierpinski triangle
\node[main tri] (A) {};
\createsierpinski{6cm}{A}{4}
% Second Sierpinski triangle (rotated to touch at the tip)
\node[main tri, rotate=180] (B) at (A.apex) {};
\createsierpinski[rotate=180]{6cm}{B}{4}
\end{tikzpicture}
\end{document}
您的代码存在一些问题和其他一些缺点。
将
\path #2;
和A
赋予第二个参数,你将得到\path A;
无效的 Ti钾Z 语法是导致“缺少分号”错误的原因。您需要在此处使用括号,并在嵌套\createsierpinski
命令中将其删除。如果您将
[yshift=-0.25*#1]#2
第二个参数作为命令的参数,您也会在某些时候得到无效语法。但实际上没有必要,yshift
因为您可以简单地使用节点形状的锚点进行定位。您的命令定义目前既不包含
\draw
也不包含\node
命令,因此没有输出。你不能说
\ifnum3-1>0
,但你需要事先进行计算,因为\ifnum
只能比较整数。你可以使用\pgfmathtruncatemacro
这个。您需要一些范围,因为否则第一个嵌套
\createsierpinski
将已经结束递归循环。如果您想要旋转事物,则需要将此转换作为选项传递给每个
\createsierpinski
命令。
答案2
这是一个使用lindenmayersystems
以下是使用(第 57 章)的PGF 手册)。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{lindenmayersystems}
\begin{document}
\begin{tikzpicture}[l-system={step=.5pt, order=8, angle=60}, rotate=-30]
\pgfdeclarelindenmayersystem{Sierpinski triangle}{
\symbol{X}{\pgflsystemdrawforward}
\symbol{Y}{\pgflsystemdrawforward}
\rule{X -> Y-X-Y}
\rule{Y -> X+Y+X}
}
\draw[red] (0,0) l-system[l-system={Sierpinski triangle, axiom=+++X, anchor=north east}];
\draw[blue] (0,0) l-system[l-system={Sierpinski triangle, axiom=X, anchor=south west}];
\end{tikzpicture}
\end{document}