
정점에 닿는 두 개의 시에르핀스키 삼각형을 그리려고 합니다. 내 코드는 다음과 같습니다
\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;
두 번째 인수를 사용 하면 유효하지 않은 Ti를A
얻게 됩니다.\path A;
케이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}