如何創建謝爾賓斯基地毯的迭代

如何創建謝爾賓斯基地毯的迭代

我想做的是創建謝爾賓斯基地毯的一系列迭代。謝爾賓斯基地毯的創建方法是將正方形劃分為九個全等的子正方形並刪除中間的子正方形,然後將剩餘的子正方形劃分為九個較小的子正方形並刪除中間的子正方形,然後迭代該過程。

我使用 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}

我希望做的是使用 lindenmayer 系統調整 Jake 的解決方案如何在 LaTeX 中創建謝爾賓斯基三角形?到一個矩形,就像 marsupilam 對六邊形所做的那樣Tikz 分形 - 謝爾賓斯基六邊形

我知道之前已經有人問過有關生成謝爾賓斯基地毯的問題。馬克·維布羅的回答使用 tikz 產生 Sierpinski 地毯不使用 lindenmayer 系統並導致我的系統掛起。亨利·門克的回答在 Tikz 中繪製簡單的分形很漂亮,但是當我減少分形的階數並且位於頂點而不是邊上時,它變得非常小。我希望使每次迭代保持相同的大小,如上所示。

我想如果我設定 order=\level,我會想要設定 \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 做類似的事情(但我不能)。第一個版本繪製了一個正方形並循環並填充了應該是白色的部分。第二種使用遞迴。

關於時間安排:

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

兩種變體的輸出看起來相同(據我所知),所以我只顯示其中一個。

答案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}

輸出

相關內容