%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
The cellular automata code was copied and pasted from:
http://tex.stackexchange.com/questions/118377/drawing-multiple-iterations-of-cellular-automatons-inline-possibly-with-tikz
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass[11pt]{beamer}
\usepackage{tikz}
% Each cell is stored globally as a macro
% for example \csname cell-glider-1-7\endcsname
\def\setcell#1#2#3{%
\pgfmathparse{int(#2)}\let\cx=\pgfmathresult%
\pgfmathparse{int(#3)}\let\cy=\pgfmathresult%
\expandafter\xdef\csname cell-#1-\cx-\cy\endcsname%
}
% Cells are accessed by parsing #2 and #3 to integers
% and assigning the cell contents to the macro #4
\def\getcell#1#2#3#4{%
\pgfmathparse{int(#2)}\let\cx=\pgfmathresult%
\pgfmathparse{int(#3)}\let\cy=\pgfmathresult%
\def\marshal{\xdef#4}%
\marshal{\csname cell-#1-\cx-\cy\endcsname}%
}
% We flip the current from `current' to `next'
% which is probably misleading. The texts can be
% any arbitrary string as long as they are different.
\def\currenttext{current}
\def\nexttext{next}
\let\currentgeneration=\currenttext
\let\nextgeneration=\nexttext
\def\switchgenerations{%
\ifx\currentgeneration\currenttext%
\global\let\currentgeneration=\nexttext%
\global\let\nextgeneration=\currenttext%
\else%
\global\let\currentgeneration=\currenttext%
\global\let\nextgeneration=\nexttext%
\fi%
}
% Define colors \csname color-#1\endcsname
% Which can be used according to the cell contents
% So \csname color-0\endcsname holds the color for cells with value 0
\def\setcolor#1{\expandafter\xdef\csname color-#1\endcsname}
\def\getcolor#1{\csname color-#1\endcsname}
% Define a 10x10 board with a border of 1 so edge
% detection is not necessary.
\foreach \x in {0,...,11}{%
\foreach \y in {0,...,11}{%
\setcell{\currentgeneration}{\x}{\y}{0}%
}% %
}%
% Copy this board for the next generation
% This is HUGELY inefficient. What would be better is
% to maintain a list of only changing cells (hard in LaTeX)
\foreach \x in {0,...,11}{%
\foreach \y in {0,...,11}{%
\setcell{\nextgeneration}{\x}{\y}{0}%
}%
}
\newcount\neighbors
\def\updategenerations{%
\begingroup\nullfont% Hmm lots of unwanted spaces occur here
\foreach \x in {1,...,10}{%
\foreach \y in {1,...,10}{%
\getcell{\currentgeneration}{\x}{\y}{\n}%
\getcell{\currentgeneration}{\x-1}{\y}{\a}%
\getcell{\currentgeneration}{\x+1}{\y}{\b}%
\getcell{\currentgeneration}{\x}{\y-1}{\c}%
\getcell{\currentgeneration}{\x}{\y+1}{\d}%
\getcell{\currentgeneration}{\x-1}{\y-1}{\e}%
\getcell{\currentgeneration}{\x+1}{\y-1}{\f}
\getcell{\currentgeneration}{\x-1}{\y+1}{\g}%
\getcell{\currentgeneration}{\x+1}{\y+1}{\h}%
\pgfmathsetcount\neighbors{\a+\b+\c+\d+\e+\f+\g+\h}%
% Here are the neighbor rules
\ifcase\neighbors %
\setcell{\nextgeneration}{\x}{\y}{0}% 0 neighbors
\or
\setcell{\nextgeneration}{\x}{\y}{0}% 1 neighbors
\or
\ifnum\n=1\relax
\setcell{\nextgeneration}{\x}{\y}{1}% 2 neighbors
\fi
\or
\setcell{\nextgeneration}{\x}{\y}{1}% 3 neighbors
\else
\setcell{\nextgeneration}{\x}{\y}{0}% more than 3 neighbors
\fi%
}%
}%
\endgroup%
\switchgenerations%
}
\def\drawcurrentgeneration{%}
\begin{tikzpicture}[x=10pt,y=10pt]
\foreach \x in {1,...,10}{%
\foreach \y in {1,...,10}{%
\setcell{\nextgeneration}{\x}{\y}{0}% Do here for a *minor* increment in speed
\getcell{\currentgeneration}{\x}{\y}{\value}%
\edef\c{\getcolor{\value}}%
\fill [fill=\c](\x, \y) rectangle ++(1,1);
}
}
\end{tikzpicture}%
}
\setcolor{0}{blue!5}
\setcolor{1}{blue!20}
\setcell{\currentgeneration}{1}{8}{1}
\setcell{\currentgeneration}{2}{8}{1}
\setcell{\currentgeneration}{3}{8}{1}
\setcell{\currentgeneration}{3}{9}{1}
\setcell{\currentgeneration}{2}{10}{1}
\title{My Document}
\author{Fufu Fang\\ University of East Anglia}
\date{\today}
\usetheme{CambridgeUS}
\usecolortheme{beaver}
\begin{document}
\maketitle
\begin{frame}
\frametitle{Introduction}
This is a document I created in UEA's \LaTeX\ class.
\end{frame}
\begin{frame}
\frametitle{Iteration 0}
\drawcurrentgeneration
\end{frame}
\foreach \iteration in {1,...,32}{
\begin{frame}
\frametitle{Iteration \iteration}
\updategenerations
\drawcurrentgeneration
\end{frame}
}
\end{document}
Comments
0 B
|👍
/👎
0 B
|👍
/👎