我想提请大家注意一下谢尔宾斯基三角形在 LaTeX 中。此外,我希望以一种可定制的方式来实现这一点;也就是说,这样我就可以专注于不同的三角形。
我会很高兴有这样的事情:
,
如果有必要的话我可以改变红色子三角形。
不过,像这样的事情会很理想:
,
和改变红色子三角形一样容易。
编辑:如果可以的话我想问一下更你的能力。我也想做这样的事:
,
其中红色和蓝色三角形可以改变(由像我这样的新手来改变)。
以下是代码图片我一直在画画。不是我的!请参阅下面的一些第一条评论。
\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.geometric}
\begin{document}
\begin{tikzpicture}[
main tri/.style={isosceles triangle,fill,isosceles triangle apex angle=60,
rotate=90,inner sep=0,outer sep=0},
filler tri/.style={isosceles triangle,fill=white,rotate=-90,isosceles triangle apex angle=60,
inner sep=0,outer sep=0}]
\node[minimum height=2cm,main tri] (a) {};
%==================
\node[minimum height=1cm,filler tri] (b) at (a.center){};
%==================
\node[minimum height=0.5cm,filler tri,anchor=right corner] (c1) at (b.left side){};
\node[minimum height=0.5cm,filler tri,anchor=left corner] (c2) at (b.right side){};
\node[minimum height=0.5cm,filler tri,anchor=apex] (c3) at (b.west){};
% ===================
\foreach \x in {1,2,3}{
\node[minimum height=0.25cm,filler tri,anchor=right corner] (d1\x) at (c\x.left side){};
\node[minimum height=0.25cm,filler tri,anchor=left corner] (d2\x) at (c\x.right side){};
\node[minimum height=0.25cm,filler tri,anchor=apex] (d3\x) at (c\x.west){};
}
% ===================
\foreach \x in {1,2,3}{
\foreach \y in {1,2,3}{
\node[minimum height=0.125cm,filler tri,anchor=right corner] (e1\x\y) at (d\x\y.left side){};
\node[minimum height=0.125cm,filler tri,anchor=left corner] (e2\x\y) at (d\x\y.right side){};
\node[minimum height=0.125cm,filler tri,anchor=apex] (e3\x\y) at (d\x\y.west){};
}
}
\end{tikzpicture}
\end{document}
恐怕我不知道从哪儿开始。
答案1
使用pdflatex
或lualatex
:
编辑可以将每次循环的迭代次数除以 2。
\documentclass[margin=3pt]{standalone}
\usepackage{tikz,xparse}
\usetikzlibrary{calc}
\usepackage{ifluatex}
\ifluatex
\usepackage{fontspec,luacode}
\directlua{dofile("Sierpinski.lua")}
\newcommand{\Sierpinski}[1]{%
\directlua{Sierpinski(#1)}
}
\else
\newcommand{\Sierpinski}[1]{%
\foreach \l in {1,...,#1} {%
\pgfmathsetmacro{\Tr}{5/(2^(\l))}
\pgfmathparse{2^\l - 1}
\ifnum\l=1
\fill [white] ($(60:\Tr)+(0,0)$) -- ++(0:\Tr) -- ++(-120:\Tr) -- cycle;")
\else
\foreach \i in {1,3,...,\pgfmathresult} {%
\pgfmathparse{2^\l - \i - 1}
\foreach \j in {0,...,\pgfmathresult} {%
\fill [white] ($(60:\i*\Tr)+(\j*\Tr,0)$) -- ++(0:\Tr) -- ++(-120:\Tr) -- cycle;")
}
}
\fi
}
}
\fi
\NewDocumentCommand{\Triangle}{%
O{S} % node prefix
m % color
m % level
mm % coordinates
}{%
\pgfmathsetmacro{\Tr}{5/2^#3}
\fill[#2] ($(60:#4*\Tr)+(#5*\Tr,0)$) coordinate (#10)
-- ++(0:\Tr) coordinate (#11)
-- ++(120:\Tr) coordinate (#12)
-- cycle;")
}
\begin{document}
\begin{tikzpicture}
\Triangle{black}{0}{0}{0}
\Triangle[R]{green}{1}{0}{1}
\Triangle[B]{blue}{2}{2}{0}
\Sierpinski{5}
\draw[-stealth,red] (R0) to [out=100, in=-20] (B0) ;
\draw[-stealth,red] (R1) to [out=100, in=-20] (B1) ;
\draw[-stealth,red] (R2) to [out=100, in=-20] (B2) ;
\end{tikzpicture}
\end{document}
和Sierpinski.lua
文件:
tp = tex.print
function Sierpinski (level)
local s = 5 -- size
--tp("\\fill [black] (0,0) -- ++(0:"..s..") -- ++(120:"..s..") -- cycle;")
for l = 1,level
do
s = s / 2
for i = 1,2^l - 1,2
do
for j = 0,2^l - i -1,2
do
tp("\\fill [white] ($(60:"..i*s..")+("..j*s..",0)$) -- ++(0:"..s..") -- ++(-120:"..s..") -- cycle;")
end
end
end
end