
Lo que quiero hacer es crear una secuencia de iteraciones de la alfombra de Sierpinski. La alfombra de Sierpinski se crea dividiendo el cuadrado en nueve subcuadrados congruentes y eliminando el del medio, luego dividiendo los subcuadrados restantes en nueve subcuadrados más pequeños y eliminando el del medio, luego se repite el proceso.
Creé el siguiente diagrama usando tikz dibujando y, cuando fuera necesario, llenando cada rectángulo individual. Sin embargo, este es un proceso tedioso e ineficiente, particularmente porque la siguiente iteración requeriría 512 rectángulos blancos adicionales.
\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}
Lo que esperaba hacer es adaptar la solución de Jake utilizando sistemas lindenmayer para¿Cómo crear un triángulo de Sierpinski en LaTeX?a un rectángulo, como lo hizo marsupilam con un hexágono enFractal Tikz - Hexágono de Sierpinski.
Soy consciente de que anteriormente se han formulado preguntas sobre la generación de una alfombra de Sierpinski. La respuesta de Mark Wibrow aGenerando una alfombra de Sierpinski con tikzno utiliza un sistema lindenmayer y hace que mi sistema se cuelgue. La respuesta de Henri Menke aDibujar un fractal simple en Tikzes hermoso, pero se vuelve bastante pequeño cuando reduzco el orden del fractal y se ubica en un vértice en lugar de en un lado. Deseo mantener cada iteración del mismo tamaño, como se muestra arriba.
Supongo que si establezco orden=\nivel, me gustaría establecer el \squarewidth=9^\level ya que cada cuadrado se divide en nueve cuadrados y debería establecer el ángulo=90 ya que cada ángulo es un ángulo recto. Sin embargo, estoy confundido acerca de cómo adaptar las reglas para los símbolos X e Y que Jake y marsupilam usaron en sus respuestas para generar los patrones que se muestran arriba.
Respuesta1
Aquí hay una macro que coloca nodos blancos en las ubicaciones apropiadas.
\sierpinski[options]{levels}
La opción que tengo en mente es scale=
, pero rotate=
también funcionará. O xscale=
si quieres rectángulos que no sean cuadrados. Asegúrate de usar 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}
Aquí está \sierpinski[scale=3, transform shape]{5}
, que es todo lo que mi máquina puede manejar. Es O(9ⁿ), así que prepárate para esperar.
Respuesta2
con una actualizaciónhttps://ctan.org/pkg/pst-fractaly corriendo 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}
y con opción basecolor=red,linecolor=blue
:
Respuesta3
Obtuviste la respuesta tikz que buscabas, así que no dudes en agregar una respuesta creada con MetaPost/MetaFun. Probablemente el código se pueda optimizar y probablemente se pueda hacer algo similar con tikz (pero yo no puedo). La primera versión dibuja un cuadrado y realiza un bucle y vacía las partes que deberían ser blancas. El segundo usa recursividad.
En cuanto al momento:
First version: 2.9s
Second version: 1.8s
Lo he incluido en páginas MetaPost en ConTeXt lmtx. El archivo se puede compilar con 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
El resultado se ve igual en ambas variantes (hasta donde puedo ver), por lo que solo muestro una de ellas.
Respuesta4
Aquí hay una versión pura de LaTeX y recursiva.
Obviamente, esto solo funciona porque estás usando rectángulos (que se colocan muy fácilmente con a tabular
).
Código
\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}