
私がやりたいのは、シェルピンスキー カーペットの反復シーケンスを作成することです。シェルピンスキー カーペットは、正方形を 9 つの合同なサブ正方形に分割して中央のサブ正方形を削除し、次に残りのサブ正方形を 9 つの小さなサブ正方形に分割して中央のサブ正方形を削除し、このプロセスを繰り返すことによって作成されます。
私は tikz を使用して、各四角形を描画し、必要に応じて塗りつぶすことで、以下の図を作成しました。ただし、これは面倒で非効率的なプロセスであり、特に次の反復ではさらに 512 個の白い四角形が必要になります。
\begin{tikzpicture}
\fill (0, 0) rectangle (1, 1);
\begin{scope}[xshift = 1.5 cm]
\fill (0, 0) rectangle (1, 1);
\fill[color=white] (1/3, 1/3) rectangle (2/3, 2/3);
\end{scope}
\begin{scope}[xshift = 3 cm]
\fill (0, 0) rectangle (1, 1);
\fill[color=white] (1/3, 1/3) rectangle (2/3, 2/3);
\fill[color=white] (1/9, 1/9) rectangle (2/9, 2/9);
\fill[color=white] (4/9, 1/9) rectangle (5/9, 2/9);
\fill[color=white] (7/9, 1/9) rectangle (8/9, 2/9);
\fill[color=white] (1/9, 4/9) rectangle (2/9, 5/9);
\fill[color=white] (7/9, 4/9) rectangle (8/9, 5/9);
\fill[color=white] (1/9, 7/9) rectangle (2/9, 8/9);
\fill[color=white] (4/9, 7/9) rectangle (5/9, 8/9);
\fill[color=white] (7/9, 7/9) rectangle (8/9, 8/9);
\end{scope}
\begin{scope}[xshift = 4.5 cm]
\fill (0, 0) rectangle (1, 1);
\fill[color=white] (1/3, 1/3) rectangle (2/3, 2/3);
\fill[color=white] (1/9, 1/9) rectangle (2/9, 2/9);
\fill[color=white] (4/9, 1/9) rectangle (5/9, 2/9);
\fill[color=white] (7/9, 1/9) rectangle (8/9, 2/9);
\fill[color=white] (1/9, 4/9) rectangle (2/9, 5/9);
\fill[color=white] (7/9, 4/9) rectangle (8/9, 5/9);
\fill[color=white] (1/9, 7/9) rectangle (2/9, 8/9);
\fill[color=white] (4/9, 7/9) rectangle (5/9, 8/9);
\fill[color=white] (7/9, 7/9) rectangle (8/9, 8/9);
\fill[color=white] (4/81, 4/81) rectangle (5/81, 5/81);
\fill[color=white] (13/81, 4/81) rectangle (14/81, 5/81);
\fill[color=white] (22/81, 4/81) rectangle (23/81, 5/81);
\fill[color=white] (31/81, 4/81) rectangle (32/81, 5/81);
\fill[color=white] (40/81, 4/81) rectangle (41/81, 5/81);
\fill[color=white] (49/81, 4/81) rectangle (50/81, 5/81);
\fill[color=white] (58/81, 4/81) rectangle (59/81, 5/81);
\fill[color=white] (67/81, 4/81) rectangle (68/81, 5/81);
\fill[color=white] (76/81, 4/81) rectangle (77/81, 5/81);
\fill[color=white] (4/81, 13/81) rectangle (5/81, 14/81);
\fill[color=white] (22/81, 13/81) rectangle (23/81, 14/81);
\fill[color=white] (31/81, 13/81) rectangle (32/81, 14/81);
\fill[color=white] (49/81, 13/81) rectangle (50/81, 14/81);
\fill[color=white] (58/81, 13/81) rectangle (59/81, 14/81);
\fill[color=white] (76/81, 13/81) rectangle (77/81, 14/81);
\fill[color=white] (4/81, 22/81) rectangle (5/81, 23/81);
\fill[color=white] (13/81, 22/81) rectangle (14/81, 23/81);
\fill[color=white] (22/81, 22/81) rectangle (23/81, 23/81);
\fill[color=white] (31/81, 22/81) rectangle (32/81, 23/81);
\fill[color=white] (40/81, 22/81) rectangle (41/81, 23/81);
\fill[color=white] (49/81, 22/81) rectangle (50/81, 23/81);
\fill[color=white] (58/81, 22/81) rectangle (59/81, 23/81);
\fill[color=white] (67/81, 22/81) rectangle (68/81, 23/81);
\fill[color=white] (76/81, 22/81) rectangle (77/81, 23/81);
\fill[color=white] (4/81, 31/81) rectangle (5/81, 32/81);
\fill[color=white] (13/81, 31/81) rectangle (14/81, 32/81);
\fill[color=white] (22/81, 31/81) rectangle (23/81, 32/81);
\fill[color=white] (58/81, 31/81) rectangle (59/81, 32/81);
\fill[color=white] (67/81, 31/81) rectangle (68/81, 32/81);
\fill[color=white] (76/81, 31/81) rectangle (77/81, 32/81);
\fill[color=white] (4/81, 40/81) rectangle (5/81, 41/81);
\fill[color=white] (22/81, 40/81) rectangle (23/81, 41/81);
\fill[color=white] (58/81, 40/81) rectangle (59/81, 41/81);
\fill[color=white] (76/81, 40/81) rectangle (77/81, 41/81);
\fill[color=white] (4/81, 49/81) rectangle (5/81, 50/81);
\fill[color=white] (13/81, 49/81) rectangle (14/81, 50/81);
\fill[color=white] (22/81, 49/81) rectangle (23/81, 50/81);
\fill[color=white] (58/81, 49/81) rectangle (59/81, 50/81);
\fill[color=white] (67/81, 49/81) rectangle (68/81, 50/81);
\fill[color=white] (76/81, 49/81) rectangle (77/81, 50/81);
\fill[color=white] (4/81, 58/81) rectangle (5/81, 59/81);
\fill[color=white] (13/81, 58/81) rectangle (14/81, 59/81);
\fill[color=white] (22/81, 58/81) rectangle (23/81, 59/81);
\fill[color=white] (31/81, 58/81) rectangle (32/81, 59/81);
\fill[color=white] (40/81, 58/81) rectangle (41/81, 59/81);
\fill[color=white] (49/81, 58/81) rectangle (50/81, 59/81);
\fill[color=white] (58/81, 58/81) rectangle (59/81, 59/81);
\fill[color=white] (67/81, 58/81) rectangle (68/81, 59/81);
\fill[color=white] (76/81, 58/81) rectangle (77/81, 59/81);
\fill[color=white] (4/81, 67/81) rectangle (5/81, 68/81);
\fill[color=white] (22/81, 67/81) rectangle (23/81, 68/81);
\fill[color=white] (31/81, 67/81) rectangle (32/81, 68/81);
\fill[color=white] (49/81, 67/81) rectangle (50/81, 68/81);
\fill[color=white] (58/81, 67/81) rectangle (59/81, 68/81);
\fill[color=white] (76/81, 67/81) rectangle (77/81, 68/81);
\fill[color=white] (4/81, 76/81) rectangle (5/81, 77/81);
\fill[color=white] (13/81, 76/81) rectangle (14/81, 77/81);
\fill[color=white] (22/81, 76/81) rectangle (23/81, 77/81);
\fill[color=white] (31/81, 76/81) rectangle (32/81, 77/81);
\fill[color=white] (40/81, 76/81) rectangle (41/81, 77/81);
\fill[color=white] (49/81, 76/81) rectangle (50/81, 77/81);
\fill[color=white] (58/81, 76/81) rectangle (59/81, 77/81);
\fill[color=white] (67/81, 76/81) rectangle (68/81, 77/81);
\fill[color=white] (76/81, 76/81) rectangle (77/81, 77/81);
\end{scope}
\end{tikzpicture}
私がやりたいのは、リンデンマイヤーシステムを使ったジェイクのソリューションを適応させることですLaTeX でシェルピンスキーの三角形を作成するにはどうすればいいですか?マルスピラムが六角形にやったように、長方形にTikz フラクタル - シェルピンスキー六角形。
シェルピンスキーカーペットの生成に関する質問が以前にもなされていることは承知しています。マーク・ウィブロウの回答tikz でシェルピンスキーカーペットを生成するリンデンマイヤーシステムを使用していないため、システムがハングアップします。Henri Menkeの回答Tikz でシンプルなフラクタルを描く美しいですが、フラクタルの次数を減らすと、辺ではなく頂点に配置され、非常に小さくなります。上記のように、各反復を同じサイズに保ちたいと思います。
order=\level を設定する場合、各正方形が 9 つの正方形に分割されるため \squarewidth=9^\level を設定し、各角度が直角であるため angle=90 を設定する必要があると思います。ただし、Jake と marsupilam が回答で使用した記号 X と Y のルールをどのように適用して上記のパターンを生成すればよいのかわかりません。
答え1
適切な場所に白いノードを配置するマクロを次に示します。
\sierpinski[options]{levels}
私が考えているオプションは ですscale=
が、これrotate=
も同様に機能します。または、xscale=
正方形ではない長方形が必要な場合。必ず を使用してくださいtransform shape
。
\documentclass{article}
\usepackage{tikz}
\newcommand{\sierpinski}[2][]{\tikz[#1]{
\draw[fill=black] rectangle(1,1);
\foreach \n[evaluate=\n as \m using \n-1, evaluate=\n as \s using 1/3^\n, evaluate=\m as \p using 3^\m] in {1,...,#2}{
\foreach \k[evaluate=\k as \x using (2*\k-1)/2/3^\m] in {1,...,\p}{
\foreach \j[evaluate=\j as \y using (2*\j-1)/2/3^\m] in {1,...,\p}{
\node[fill=white, minimum size=\s cm, inner sep=0] at (\x,\y){};
}}}}}
\begin{document}
\tikz{\draw[fill=black] rectangle(1,1);}\quad\sierpinski{1}\quad\sierpinski{2}\quad\sierpinski{3}\quad\sierpinski{4}
\end{document}
これが\sierpinski[scale=3, transform shape]{5}
私のマシンが処理できるほぼすべてです。O(9ⁿ) なので、待つ準備をしてください。
答え2
最新のhttps://ctan.org/pkg/pst-fractal実行中 lualatex
:
\documentclass[pstricks]{standalone}
\usepackage{pst-fractal}
\begin{document}
\begin{pspicture}(18,3)
\multido{\iA=1+1,\iB=0+12}{6}{%
\psSierCarpet[scale=0.25,n=\iA](\iB,0.2)}
\end{pspicture}
\end{document}
オプション付きbasecolor=red,linecolor=blue
:
答え3
探していた tikz の回答が得られましたので、MetaPost/MetaFun で作成した回答を自由に追加します。おそらくコードは最適化でき、おそらく tikz でも同様のことができるでしょう (しかし、私にはできません)。最初のバージョンでは、正方形を描画してループし、白であるべき部分を塗りつぶしません。2 番目では再帰を使用します。
タイミングについて:
First version: 2.9s
Second version: 1.8s
私はそれを ConTeXt lmtx の MetaPost ページにラップしました。ファイルは でコンパイルできますcontext
。
\starttext
\startMPpage[offset=1dk]
vardef sierpinski(expr w, n) =
image(
fill unitsquare scaled w ;
for i = 1 upto n :
for j = 1 upto (3^(i-1)) :
for k = 1 upto (3^(i-1)) :
unfill unitsquare scaled (w/(3^i)) shifted ( (3*j-2)*w/(3^i), (3*k-2)*w/(3^i) ) ;
endfor
endfor
endfor)
enddef ;
for i = 1 upto 3 :
draw sierpinski(3cm,i) shifted (4*(i-1)*cm, 0 ) ;
draw sierpinski(3cm,i+3) shifted (4*(i-1)*cm, -4cm) ;
endfor ;
\stopMPpage
\startMPpage[offset=1dk]
vardef Sierpinski(expr w,n) =
save tmppic ;
picture tmppic ;
if n = 1 :
image(
fill unitsquare scaled w ;
unfill unitsquare scaled (w/3) shifted (w/3,w/3) ;
)
else :
tmppic := Sierpinski(w, n - 1) scaled 1/3 ;
image(
for i = 1 upto 3 :
for j = 1 upto 3 :
if ((i*j) <> 4) :
draw tmppic shifted (((i-1)/3)*w,((j-1)/3)*w) ;
fi
endfor
endfor
)
fi
enddef ;
for i = 1 upto 3 :
draw Sierpinski(3cm,i) shifted (4*(i-1)*cm, 0 ) ;
draw Sierpinski(3cm,i+3) shifted (4*(i-1)*cm, -4cm) ;
endfor ;
\stopMPpage
\stoptext
出力は両方のバリエーションで同じように見えるので (私が見る限り)、そのうちの 1 つだけを示します。
答え4
純粋な LaTeX と再帰バージョンを以下に示します。
これは明らかに、長方形 ( を使用すると非常に簡単に配置できますtabular
) を使用しているためのみ機能します。
コード
\documentclass{article}
\newcommand*\startCarpet[2][1em]{{%
\renewcommand*\arraystretch{0}%
\setlength\fboxsep{0pt}\setlength\fboxrule{#1}%
\edef\BOX{\noexpand\fbox{%
\noexpand\rule[-\the\dimexpr#1/2\relax]{0pt}{#1}\noexpand\rule{#1}{0pt}}}%
\def\TAB##1{\tabular{@{}c@{}c@{}c@{}}##1&##1&##1\\##1&&##1\\##1&##1&##1\endtabular}%
\def\level{#2}%
\def\doCarpet{%
\ifnum\level=0
\def\next{\TAB{\BOX}}%
\else
\def\next{%
\edef\level{\inteval{\level-1}}%
\TAB{\doCarpet}}%
\fi
\next}
\doCarpet}}
\begin{document}
\centering
\startCarpet{0}
\startCarpet[.3333em]{1}
\startCarpet[.1111em]{2}
\startCarpet[.117em]{3}
\end{document}