Tikz 分形-均匀康托集

Tikz 分形-均匀康托集

与我的其他分形相一致:Tikz 分形 - Cantor DustTikz 分形 - Menger 海绵,你们这些可爱的人帮助我创建了,我想构造一个“均匀康托集”。

构造如下:

取单位区间 [0,1],在每个阶段用 n 个长度小于 |I|/n 的区间(固定数量)替换每个区间,其中 |I| 是区间的长度,并且每个子区间的端点与其“父”区间的端点重合。

下面是一张图片,试图使我的粗略解释更清楚一些: 在此处输入图片描述

标准中间三分之一康托集是 n=2 和 |I|=1/3: 在此处输入图片描述

除了计算出所有的长度和间距外,我如何才能“自动”构建它?我的想法是我应该使用线段系统,但我以前没有对线段进行过这样的操作。

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

相关内容