その他一覧へ戻る

シェルピンスキー三角形

鉄TeX機能紹介/TikZサンプル/シェルピンスキー三角形.tex鉄TeX機能紹介 / TikZhybrid

レンダリング結果

5ページ / 同名PDFあり
シェルピンスキー三角形 preview
シェルピンスキー三角形 preview
シェルピンスキー三角形 preview

先頭3ページのみプレビューしています。

PDFを開く
TeXソース
TeXソース
入力コード
\documentclass[dvipdfmx]{article}
\usepackage{tikz}
\pagestyle{empty}
\usepackage[dvipdfmx,active,tightpage]{preview}
\PreviewEnvironment{center}
\setlength\PreviewBorder{5mm}

\makeatletter

\newcount\@maxDepth
\newcount\@nest
\newcount\@@nest
\newcount\@nextdeg
\def\@prefix{Sierpinski}
\def\@relax{\relax}
\def\A{B-A-B}
\def\B{A+B+A}

\def\build#1{%
  \@maxDepth=#1
  \advance\@maxDepth-1
  %%% expand the L-system string ( -> \@lsystem )
  \@nest=0
  \@namedef{\@prefix0}{}%
  \expandafter\@expandLsystem\A\relax
  \edef\@lsystem{\@nameuse{\@prefix0}}%
  %%% build the TikZ source ( -> \Points )
  \def\Points{(0,0)}%
  \expandafter\@buildPoints\@lsystem\relax
}

%%% expand the L-system string recursively up to \@maxDepth and set \@lsystem to the result
\def\@expandLsystem#1{%
  \def\@target{#1}%
  \ifx\@target\@relax
    \let\@next\relax
  \else
    \ifnum0\if\@target A1\fi\if\@target B1\fi>0
       \ifnum\@nest<\@maxDepth\relax
         \advance\@nest1
         \@namedef{\@prefix\the\@nest}{}%
         \expandafter\expandafter\expandafter\@expandLsystem\csname\@target\endcsname\relax
         \@@nest=\@nest
         \advance\@nest-1
         \expandafter\edef\csname\@prefix\the\@nest\endcsname{\csname\@prefix\the\@nest\endcsname\csname\@prefix\the\@@nest\endcsname}%
       \else
         \expandafter\edef\csname\@prefix\the\@nest\endcsname{\csname\@prefix\the\@nest\endcsname F}%
       \fi
    \else
      \expandafter\edef\csname\@prefix\the\@nest\endcsname{\csname\@prefix\the\@nest\endcsname\@target}%
    \fi
    \let\@next\@expandLsystem
  \fi
  \@next
}

%%% translate L-system \@lsystem into TikZ source \Points
\def\@buildPoints#1{%
  \def\@target{#1}%
  \ifx\@target\@relax
    \let\@next\relax
  \else
    \if\@target+
      \advance\@nextdeg60
    \fi
    \if\@target-
      \advance\@nextdeg-60
    \fi
    \if\@target F
      \edef\Points{\Points--++(\the\@nextdeg:1)}%
    \fi
    \let\@next\@buildPoints
  \fi
  \@next
}

\begin{document}

\newdimen\scale
\newcount\size
\foreach \i in {2,4,...,10}{%
  \begin{center}
    \build{\i}%
    \scale=10cm
    \size=1
    \foreach \j in {1,...,\i}{%
      \global\divide\scale2
      \global\multiply\size2
    }%
    \begin{tikzpicture}[x=\scale,y=\scale,thick]
      \draw[color=red!60!white]\Points;
    \end{tikzpicture}%
    \newpage
  \end{center}
}

\end{document}