
Я пытаюсь нарисовать два треугольника Серпинского, которые касаются вершины. Мой код следующий:
\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 вРуководство по ПГФ).
\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}