绘制谢尔宾斯基全身图 (使用 LaTeX)

绘制谢尔宾斯基全身图 (使用 LaTeX)

我想提请大家注意一下谢尔宾斯基三角形在 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

使用pdflatexlualatex

编辑可以将每次循环的迭代次数除以 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

相关内容