その他一覧へ戻る

ヒルベルト曲線

鉄TeX機能紹介/TikZサンプル/ヒルベルト曲線.tex鉄TeX機能紹介 / TikZhybrid

レンダリング結果

6ページ / 同名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{Hilbert}
\def\@relax{\relax}
\def\A{-BF+AFA+FB-}
\def\B{+AF-BFB-FA+}

\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 ( -> \HilbertPoints )
  \def\HilbertPoints{(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}%
       \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 \HilbertPoints
\def\@buildPoints#1{%
  \def\@target{#1}%
  \ifx\@target\@relax
    \let\@next\relax
  \else
    \if\@target+
      \advance\@nextdeg90
    \fi
    \if\@target-
      \advance\@nextdeg-90
    \fi
    \if\@target F
      \edef\HilbertPoints{\HilbertPoints--++(\the\@nextdeg:1)}%
    \fi
    \let\@next\@buildPoints
  \fi
  \@next
}

\begin{document}

\newdimen\scale
\newcount\size
\foreach \i in {1,...,6}{%
  \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]
      \draw[thick](-0.5,0.5) rectangle (\size-0.5, -\size+0.5);
      \draw[line width=2pt,color=red!60!white]\HilbertPoints;
    \end{tikzpicture}%
    \par\vspace{3mm}{\Huge $n=\i$}%
    \newpage
  \end{center}
}

\end{document}