与我的其他分形相一致:Tikz 分形 - Cantor Dust和Tikz 分形 - Menger 海绵,你们这些可爱的人帮助我创建了,我想构造一个“均匀康托集”。
构造如下:
取单位区间 [0,1],在每个阶段用 n 个长度小于 |I|/n 的区间(固定数量)替换每个区间,其中 |I| 是区间的长度,并且每个子区间的端点与其“父”区间的端点重合。
除了计算出所有的长度和间距外,我如何才能“自动”构建它?我的想法是我应该使用线段系统,但我以前没有对线段进行过这样的操作。
答案1
和lindenmayer system
。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{lindenmayersystems}
\pgfdeclarelindenmayersystem{cantor set}{
\rule{F -> FfF}
\rule{f -> fff}
}
\begin{document}
\begin{tikzpicture}
\foreach \order in {0,...,4}
\draw[yshift=-\order*10pt] l-system[l-system={cantor set, axiom=F, order=\order, step=100pt/(3^\order)}];
\end{tikzpicture}
\end{document}
可分为三位的康托集是现有康托集的简单扩展:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{lindenmayersystems}
\pgfdeclarelindenmayersystem{cantor set}{
\rule{F -> FfFfF}
\rule{f -> fffff}
}
\begin{document}
\begin{tikzpicture}
\foreach \order in {0,...,4}
\draw[yshift=-\order*10pt] l-system[l-system={cantor set, axiom=F, order=\order, step=100pt/(5^\order)}];
\end{tikzpicture}
\end{document}
答案2
您可以使用库Cantor set
中的装饰decorations.fractals
。手册中给出了一个示例:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.fractals}
\begin{document}
\begin{tikzpicture}[decoration=Cantor set,very thick]
\draw decorate{ (0,0) -- (3,0) };
\draw decorate{ decorate{ (0,-.5) -- (3,-.5) }};
\draw decorate{ decorate{ decorate{ (0,-1) -- (3,-1) }}};
\draw decorate{ decorate{ decorate{ decorate{ (0,-1.5) -- (3,-1.5) }}}};
\end{tikzpicture}
\end{document}
答案3
基于盒子和规则的解决方案:
\documentclass{article}
\makeatletter
\newcommand*{\gen}[1]{%
\hrule height 5mm\relax
\ifnum#1>0 %
\expandafter\@firstofone
\else
\expandafter\@gobble
\fi
{%
\kern5mm\relax
\hbox to \hsize{%
\vbox{%
\hsize=.3333\hsize
\gen{\numexpr#1-1}%
}\hfill
\vbox{%
\hsize=.3333\hsize
\gen{\numexpr#1-1}%
}%
}%
}%
}
\newcommand*{\genpic}[2]{%
\begin{minipage}{#1}%
\gen{#2}%
\end{minipage}%
}
\makeatother
\begin{document}
\noindent
\genpic{\linewidth}{8}
\end{document}
答案4
我对 Lindenmayer 系统一无所知,但使用 TeX 递归可以轻松做到这一点。
输出
下面的 PNG 看起来不太好,但 PDF 还可以。
n=11
从那时起,代码就开始变慢了。
代码
\documentclass[12pt,tikz]{standalone}
\begin{document}
\begin{tikzpicture}[xscale=20,yscale=2]
\def\gen|#1|
{
\if 0#1
\path[fill] (0,0) rectangle (1,.8) ;
\else
\begin{scope}[xscale=1/3,yshift=-1cm]
\pgfmathtruncatemacro{\k}{#1-1}
\gen|\k|
\begin{scope}[xshift=2cm]
\gen|\k|
\end{scope}
\end{scope}
\fi
}
\foreach \k in {0,...,11}
{
\gen|\k|
}
\end{tikzpicture}
\end{document}