So erstellen Sie Iterationen des Sierpinski-Teppichs

So erstellen Sie Iterationen des Sierpinski-Teppichs

Ich möchte eine Folge von Iterationen des Sierpinski-Teppichs erstellen. Der Sierpinski-Teppich entsteht, indem das Quadrat in neun kongruente Teilquadrate unterteilt wird und das mittlere entfernt wird. Anschließend werden die verbleibenden Teilquadrate in neun kleinere Teilquadrate unterteilt und das mittlere entfernt. Anschließend wird der Vorgang wiederholt.

Ich habe das folgende Diagramm mit Tikz erstellt, indem ich jedes einzelne Rechteck gezeichnet und, wo nötig, ausgefüllt habe. Dies ist jedoch ein mühsamer und ineffizienter Prozess, insbesondere da die nächste Iteration weitere 512 weiße Rechtecke erfordern würde.

Sierpinski-Teppich

\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}

Ich wollte Jakes Lösung mit Lindenmayer-Systemen anpassen, umWie erstelle ich ein Sierpinski-Dreieck in LaTeX?zu einem Rechteck, wie Marsupilam es für ein Sechseck tat inTikz-Fraktal – Sierpinski-Sechseck.

Ich bin mir bewusst, dass Fragen zur Erzeugung eines Sierpinski-Teppichs bereits gestellt wurden. Mark Wibrows Antwort aufErstellen eines Sierpinski-Teppichs mit Tikzverwendet kein Lindenmayer-System und verursacht bei mir ein Hängenbleiben. Henri Menkes Antwort aufZeichnen eines einfachen Fraktals in Tikzist schön, wird aber ziemlich klein, wenn ich die Ordnung des Fraktals reduziere und es auf einem Scheitelpunkt statt auf einer Seite sitzt. Ich möchte jede Iteration gleich groß halten, wie oben gezeigt.

Ich nehme an, wenn ich order=\level einstelle, möchte ich \squarewidth=9^\level einstellen, da jedes Quadrat in neun Quadrate unterteilt ist, und ich sollte angle=90 einstellen, da jeder Winkel ein rechter Winkel ist. Ich bin mir jedoch nicht sicher, wie ich die Regeln für die Symbole X und Y anpassen soll, die Jake und marsupilam in ihren Antworten verwendet haben, um die oben gezeigten Muster zu erzeugen.

Antwort1

Hier ist ein Makro, das weiße Knoten an den entsprechenden Stellen platziert.

\sierpinski[options]{levels}

Mir schwebt die Option vor scale=, aber rotate=sie funktioniert auch. Oder xscale=wenn Sie Rechtecke wollen, die keine Quadrate sind, verwenden Sie unbedingt transform shape.

Bildbeschreibung hier eingeben

\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}

Hier ist \sierpinski[scale=3, transform shape]{5}, das ist ungefähr alles, was meine Maschine verarbeiten kann. Es ist O(9ⁿ), also bereiten Sie sich auf eine Wartezeit vor.

Bildbeschreibung hier eingeben

Antwort2

mit einem aktuellenhttps://ctan.org/pkg/pst-fractalund läuft 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}

Bildbeschreibung hier eingeben

und mit Option basecolor=red,linecolor=blue:

Bildbeschreibung hier eingeben

Antwort3

Sie haben die gesuchte Tikz-Antwort erhalten, daher kann ich gerne eine mit MetaPost/MetaFun erstellte Antwort hinzufügen. Wahrscheinlich kann der Code optimiert werden, und wahrscheinlich kann man mit Tikz etwas Ähnliches machen (ich kann es aber nicht). Die erste Version zeichnet ein Quadrat und führt eine Schleife aus und füllt die Teile aus, die weiß sein sollten. Die zweite verwendet Rekursion.

Zum Zeitpunkt:

First version: 2.9s
Second version: 1.8s

Ich habe es in MetaPost-Seiten in ConTeXt lmtx eingebunden. Die Datei kann mit kompiliert werden 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

Die Ausgabe sieht in beiden Varianten gleich aus (soweit ich sehen kann), daher zeige ich nur eine davon.

Antwort4

Hier ist eine reine LaTeX- und Rekursionsversion.

Dies funktioniert offensichtlich nur, weil Sie Rechtecke verwenden (die sehr einfach mit einem platziert werden können tabular).

Code

\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}

Ausgabe

verwandte Informationen