# Example: Symmetries of the plane

Published 2012-02-26 | Author: Cristóbal Camarero Coterillo

An implementation of all 17 plane symmetries in TikZ. With the orbifold signature these are the following:

 *632 *442 *333 *2222 ** 2*22 *x 4*2 3*3 22* 22x xx 632 442 333 2222 o

For their meaning and more pretty pictures see "The Symmetries of Things" by John H. Conway, Heidi Burgiel and Chaim Goodman-Strauss.

A brief comment about the orbifold signature: A number n before * represent a gyration point of order n, thus in 632 we have three effectively distinct points with respective orders 6, 3 and 2. Each * represents a kaleidoscope, a kaleidoscope which is not followed by a number is a mirror, a following number n represent a point where n mirror lines cross. Thus, in *333 we have a kaleidoscope with 3 different points, in each one, there are crossing 3 mirrors. In 4*2 we have a gyration point of order 4, the four neighbour point are actually the same point, a point where 2 mirrors cross. The x is called a miracle and represent a reflection which cannot be explained by a mirror line. Finally, the o is called a wonder and represents translations which are not explained by any previous symbol.                 Do you have a question regarding this example, TikZ or LaTeX in general? Just ask in the LaTeX Forum.
Oder frag auf Deutsch auf TeXwelt.de. En français: TeXnique.fr.

% Symmetries of the plane
% Author: Cristóbal Camarero Coterillo
\documentclass[a4paper, 12pt, landscape]{article}
\usepackage[utf8]{inputenc}
\usepackage{textcomp}
\usepackage{tikz}
\usetikzlibrary{shapes,calc,decorations.pathmorphing,decorations.fractals}
\usepackage[bookmarks=true]{hyperref}

%landscape tuning
\setlength{\oddsidemargin}{0in}		% default=0in
\setlength{\textwidth}{9in}		% default=9in
\setlength{\columnsep}{0.5in}		% default=10pt
\setlength{\columnseprule}{1pt}		% default=0pt (no line)
\setlength{\textheight}{5.85in}		% default=5.15in
\setlength{\topmargin}{-0.15in}		% default=0.20in
\setlength{\parskip}{1.2ex}
\setlength{\parindent}{0mm}

%PDF Settings
\newcommand\titulo{Symmetries of the plane}
\newcommand\autor{\href{http://www.alumnos.unican.es/ccc66}
{Cristóbal Camarero Coterillo}}
\hypersetup{
%bookmarks=true,         % show bookmarks bar?
unicode=false,          % non-Latin characters in Acrobats bookmarks
pdftoolbar=true,        % show Acrobats toolbar?
pdffitwindow=true,      % page fit to window when opened
pdftitle={\titulo},     % title
pdfauthor={\autor},     % author
pdfsubject={symmetries of the plane in tikz},	% subject of the document
pdfnewwindow=true,      % links in new window
pdfkeywords={plane,symmetry,orbifold},% list of keywords
pdfpagemode=None,		% avoid auto open bookmarks
citecolor=green,        % color of links to bibliography
filecolor=magenta,      % color of file links
urlcolor=cyan           % color of external links
}

\begin{document}
\newsavebox{\piece}%A TeX box to store the base tile (or orbifold)
\clearpage

%*632
\savebox{\piece}{%We create the base tile
\begin{tikzpicture}[overlay]
\node[star,draw=red!50!black,inner sep=1pt] at (0.7,0.3) {};
\node[red,anchor=base] at (0.55,0.05) {\tiny $*632$};
\draw[thin] (0,0) -- ++(0:1) -- ++(120:0.5) --cycle;
\end{tikzpicture}}
\begin{center}%We replicate the tile according to the symmetry
\begin{tikzpicture}[every node/.style={anchor=center,draw=none}]
%The \i loop creates a supertile which can tile by translations
%which is done by the \a and \b loops
\foreach \a in {0,...,7}
\foreach \b in {0,...,7}
\foreach \i in {0,1,2,3,4,5}
{
\path (0,0)
++(0:\a) ++(60:\a) ++(0:\b) ++(-60:\b)
node[rotate=\i*60] {\usebox{\piece}}
node[rotate=\i*60,yscale=-1] {\usebox{\piece}};
}
\end{tikzpicture}
\end{center}
\clearpage

%632
\savebox{\piece}{%
\begin{tikzpicture}[overlay]
\node[blue] at (0.3,0.4) {\tiny 632};
\draw[thin] (0,0) -- ++(0:1) -- ++(120:1) --cycle;
\end{tikzpicture}}
\begin{center}
\begin{tikzpicture}[every node/.style={anchor=center,draw=none}]
\foreach \a in {0,...,8}
\foreach \b in {0,...,8}
\foreach \i in {0,1,2,3,4,5}
{
\path (0,0)
++(0:\a) ++(60:\a) ++(0:\b) ++(-60:\b)
node[rotate=\i*60] {\usebox{\piece}};
}
\end{tikzpicture}
\end{center}
\clearpage

%*442
\savebox{\piece}{%
\begin{tikzpicture}[overlay]
\node[arrow box,arrow box arrows={south:0.5cm,west:0.5cm},draw=red!50!black,inner sep=4pt] at (0.8,0.8) {};
\node[red,anchor=base] at (0.4,0.05) {\tiny $*442$};
\draw[thin] (0,0) -- ++(0:1) -- ++(90:1) --cycle;
\end{tikzpicture}}
\begin{center}
\begin{tikzpicture}[every node/.style={anchor=center,draw=none}]
\foreach \a in {0,...,8}
\foreach \b in {0,...,7}
\foreach \i in {0,1,2,3}
{
\path (0,0) ++(0:2*\a) ++(90:2*\b)
node[rotate=\i*90] {\usebox{\piece}}
node[rotate=\i*90,yscale=-1] {\usebox{\piece}};
}
\end{tikzpicture}
\end{center}
\clearpage

%4*2
\savebox{\piece}{%
\begin{tikzpicture}[overlay]
\node[single arrow,draw,shape border rotate=90,inner sep=0pt,minimum height=.5cm] at (0.5,0.6) {\tiny up};
\node[blue] at (0.3,0.3) {\tiny 4\color{red}$*$2};
\draw[thin] (0,0) -- ++(0:1) -- ++(90:1) -- ++(180:1) --cycle;
\end{tikzpicture}}
\begin{center}
\begin{tikzpicture}[every node/.style={anchor=center,draw=none}]
\foreach \a in {0,...,4}
\foreach \b in {0,...,3}
\foreach \i in {0,1,2,3}
{
\path (0,0) ++(0:4*\a) ++(90:4*\b)
node[rotate=\i*90] {\usebox{\piece}}
+(2,0) node[rotate=\i*90,xscale=-1] {\usebox{\piece}}
+(0,2) node[rotate=\i*90,yscale=-1] {\usebox{\piece}}
+(2,2) node[rotate=\i*90] {\usebox{\piece}};
}
\end{tikzpicture}
\end{center}
\clearpage

%442
\savebox{\piece}{%
\begin{tikzpicture}[overlay]
\node[blue] at (0.3,0.4) {\tiny 442};
\draw[red!40!green] (1,0) -- (14/29,35/29);
\draw[densely dotted,red] (14/29,35/29) -- (1,1);
\draw[thin] (0,0) -- ++(0:1) -- ++(90:1) -- ++(180:1) --cycle;
\end{tikzpicture}}
\begin{center}
\begin{tikzpicture}[every node/.style={anchor=center,draw=none}]
\foreach \a in {0,...,8}
\foreach \b in {0,...,6}
\foreach \i in {0,1,2,3}
{
\path (0,0) ++(0:2*\a) ++(90:2*\b)
node[rotate=\i*90] {\usebox{\piece}};
}
\end{tikzpicture}
\end{center}
\clearpage

%*333
\savebox{\piece}{%
\begin{tikzpicture}[overlay]
\node[regular polygon,regular polygon sides=3,draw=green,inner sep=2pt] at (0.5,0.55) {};
\node[red] at (0.45,0.2) {\tiny $*333$};
\draw[thin] (0,0) -- ++(0:1) -- ++(120:1) --cycle;
\end{tikzpicture}}
\begin{center}
\begin{tikzpicture}[every node/.style={anchor=center,draw=none}]
\foreach \a in {0,...,8}
\foreach \b in {0,...,7}
\foreach \i in {0,1,2}
{
\path (0,0)
++(0:\a) ++(60:\a) ++(0:\b) ++(-60:\b)
node[rotate=\i*120] {\usebox{\piece}}
node[rotate=\i*120-60,xscale=-1] {\usebox{\piece}};
}
\end{tikzpicture}
\end{center}
\clearpage

%3*3
\pgfmathparse{sqrt(3)/3}
\let\altitude=\pgfmathresult
\savebox{\piece}{%
\begin{tikzpicture}[overlay]
\node[blue] at (0,-0.2) {\tiny 3\color{red}$*$3};
\draw[thin,decorate,decoration={coil,amplitude=.5pt,segment length=0.5*\altitude cm}] (0,0) -- ++(-30:\altitude);
\draw[thin,dashed] (0,0) ++(-30:\altitude) -- ++(-1,0);
\end{tikzpicture}}
\begin{center}
\begin{tikzpicture}[every node/.style={anchor=center,draw=none}]
\foreach \a in {0,...,11}
\foreach \b in {0,...,12}
\foreach \i in {0,1,2}
{
\path (0,0)
++(90:\a*\altitude) ++(30:\a*\altitude) ++(-30:\b*\altitude) ++(30:\b*\altitude)
node[rotate=\i*120] {\usebox{\piece}}
+(0,-\altitude) node[rotate=\i*120,yscale=-1] {\usebox{\piece}};
}
\end{tikzpicture}
\end{center}
\clearpage

%333
\savebox{\piece}{%
\begin{tikzpicture}[overlay]
\draw[red] (0.2,0.17) circle (2pt);
\draw[blue] (0.6,0.3) circle (3pt);
\node at (-0.1,0.5) {p};
\node[blue] at (0.3,0.7) {\tiny 333};
\draw[thick] (0,0) -- ++(0:1) -- ++(120:1) -- ++(180:1) --cycle;
\end{tikzpicture}}
\begin{center}
\begin{tikzpicture}[every node/.style={anchor=center,draw=none}]
\foreach \a in {0,...,8}
\foreach \b in {0,...,8}
\foreach \i in {0,1,2}
{
\path (0,0) ++(0:\a) ++(60:\a) ++(0:\b) ++(-60:\b)
node[rotate=\i*120] {\usebox{\piece}};
}
\end{tikzpicture}
\end{center}
\clearpage

%*2222
\savebox{\piece}{%
\begin{tikzpicture}[overlay]
\node[arrow box,arrow box arrows={south:0.5cm,west:0.5cm},draw=red!50!black,inner sep=4pt] at (0.8,0.8) {};
\node[red] at (0.3,0.4) {\tiny $*2222$};
\draw[thin] (0,0) -- ++(0:1) -- ++(90:1) -- ++(180:1) --cycle;
\end{tikzpicture}}
\begin{center}
\begin{tikzpicture}[every node/.style={anchor=center,draw=none}]
\foreach \a in {0,...,9}
\foreach \b in {0,...,7}
\foreach \i in {0,1}
{
\path (0,0) ++(0:2*\a) ++(90:2*\b)
node[rotate=\i*180] {\usebox{\piece}}
node[rotate=\i*180,yscale=-1] {\usebox{\piece}};
}
\end{tikzpicture}
\end{center}
\clearpage

%2*22
\savebox{\piece}{%
\begin{tikzpicture}[overlay]
\node[blue] at (0.0,0.4) {\tiny 2\color{red}$*$22};
\draw[very thin,red,densely dotted] (0,0) ++(0:0.5) -- ++(90:1) -- ++(180:1) -- ++(-90:1);
\draw[very thick,decoration=Cantor set] (0,0) decorate{decorate{++(0:0.5) -- ++(90:1) -- ++(180:1) -- ++(-90:1)}};
\draw[thin,decoration=Koch curve type 2,color=blue!60!black] decorate{decorate{decorate{(-0.5,0)--(0.5,0)}}};
\end{tikzpicture}}
\begin{center}
\begin{tikzpicture}[every node/.style={anchor=center,draw=none}]
\foreach \a in {0,...,8}
\foreach \b in {0,...,3}
\foreach \i in {0,1}
{
\path (0,0) ++(0:2*\a) ++(90:4*\b)
node[rotate=\i*180] {\usebox{\piece}}
+(0,2) node[rotate=\i*180,yscale=-1] {\usebox{\piece}}
+(1,0) node[rotate=\i*180,xscale=-1] {\usebox{\piece}}
+(1,2) node[rotate=\i*180] {\usebox{\piece}};
}
\end{tikzpicture}
\end{center}
\clearpage

%22*
\savebox{\piece}{%
\begin{tikzpicture}[overlay]
\node[blue,anchor=base east] at (0.5,0.05) {\tiny 22\color{red}$*$};
\draw[thick,blue,rounded corners] (0,0.2) -- ++(0.4,0.3) -- ++(-0.8,0.3) --(0,1);
\draw[thin] (0,0) -- ++(0:0.5) -- ++(90:1) -- ++(180:1) -- ++(-90:1) --cycle;
\end{tikzpicture}}
\begin{center}
\begin{tikzpicture}[every node/.style={anchor=center,draw=none}]
\foreach \a in {0,...,8}
\foreach \b in {0,...,6}
\foreach \i in {0,1}
{
\path (0,0) ++(0:2*\a) ++(90:2*\b)
node[rotate=\i*180] {\usebox{\piece}}
+(1,0) node[rotate=\i*180,xscale=-1] {\usebox{\piece}};
}
\end{tikzpicture}
\end{center}
\clearpage

%22x
\def\miraclelength{0.3}
\savebox{\piece}{%
\begin{tikzpicture}[overlay]
\node[blue,anchor=base east] at (0.5,0.05) {\tiny 22\color{red}$\times$};
\draw[thick,blue,rounded corners] (0,0.2) -- (0.4,0.5) -- (-0.4,0.4) --(0,1);
\draw[thick,dashdotted,red!50!black] (0,0) ++(0:0.5) -- ++(90:1);
\fill[red] (.1,0.7) circle (0.15cm);
\end{tikzpicture}}
\begin{center}
\begin{tikzpicture}[every node/.style={anchor=center,draw=none}]
\foreach \a in {0,...,8}
\foreach \b in {0,...,6}
\foreach \i in {0,1}
{
\path (0,0) ++(0:2*\a) ++(90:2*\b)
node[rotate=\i*180] {\usebox{\piece}}
+(1,\miraclelength) node[rotate=\i*180,xscale=-1] {\usebox{\piece}};
}
\end{tikzpicture}
\end{center}
\clearpage

%2222
\savebox{\piece}{%
\begin{tikzpicture}[overlay]
\node[blue,anchor=base east] at (0.5,0.05) {\tiny 2222};
\draw[thick,blue,rounded corners] (0,0.2) -- ++(0.4,0.3) -- ++(-0.8,0.3) --(0,1);
\draw[draw=gray,double={blue!50!green},rounded corners] (-0.5,0.5) -- (-0.3,0.3) -- (0.3,0.8) -- (0.5,0.5);
\end{tikzpicture}}
\begin{center}
\begin{tikzpicture}[every node/.style={anchor=center,draw=none}]
\foreach \a in {0,...,8}
\foreach \b in {0,...,6}
\foreach \i in {0,1}
{
\pgfmathparse{-(-1)^\i}
\let\res=\pgfmathresult
\path (0,0) ++(0:2*\a) ++(90:2*\b)
node[rotate=\i*180] {\usebox{\piece}}
+(1,\res) node[rotate=\i*180] {\usebox{\piece}};
}
\end{tikzpicture}
\end{center}
\clearpage

%**
\def\repetition{1.0}
\savebox{\piece}{%
\begin{tikzpicture}[overlay]
\node[red,draw=red!80!black,shape=rectangle callout,anchor=center] at (0.5,0.5) {\tiny **};
\end{tikzpicture}}
\begin{center}
\begin{tikzpicture}[every node/.style={anchor=center,draw=none}]
\foreach \a in {0,...,8}
\foreach \b in {0,...,12}
\foreach \i in {0,1}
{
\path (0,0) ++(0:2*\a) ++(90:\b*\repetition)
node {\usebox{\piece}}
node[xscale=-1] {\usebox{\piece}};
}
\end{tikzpicture}
\end{center}
\clearpage

%*x
\def\repetition{2.0}
\def\miraclelength{0.5}
\savebox{\piece}{%
\begin{tikzpicture}[overlay]
\node[red,anchor=base west] at (0.1,0.7) {\small $*\times$};
\end{tikzpicture}}
\begin{center}
\begin{tikzpicture}[every node/.style={anchor=center,draw=none}]
\foreach \a in {0,...,7}
\foreach \b in {0,...,5}
\foreach \i in {0,1}
{
\path (0,0) ++(2*\a,\miraclelength*\a) ++(90:\b*\repetition)
node {\usebox{\piece}}
node[xscale=-1] {\usebox{\piece}};
}
\end{tikzpicture}
\end{center}
\clearpage

%xx
\def\repetition{2.0}
\def\miraclelength{0.5}
\savebox{\piece}{%
\begin{tikzpicture}[overlay]
\draw[green,thick] (1.0,0.5) -- (0.3,0) (1.0,0.5) -- (0.8,0) (1.3,0.0) -- (1.55,0.2) -- (1.8,0.0);
\node[draw,shape=starburst,red,starburst point height=0.3cm,inner sep=0pt] at (1.0,0.5) {\small $\times\times$};
\end{tikzpicture}}
\begin{center}
\begin{tikzpicture}[every node/.style={anchor=center,draw=none}]
\foreach \a in {0,...,7}
\foreach \b in {0,...,5}
{
\path (0,0) ++(0:\repetition*\a) ++(90:2*\b)
node {\usebox{\piece}}
+(0:\miraclelength) node[yscale=-1] {\usebox{\piece}};
}
\end{tikzpicture}
\end{center}
\clearpage

%o
\def\repetitionax{1.0}
\def\repetitionay{0.2}
\def\repetitionbx{0.5}
\def\repetitionby{2.0}
\pgfmathparse{0.5*(\repetitionax+\repetitionbx)}
\let\repetitioncx=\pgfmathresult
\pgfmathparse{0.5*(\repetitionay+\repetitionby)}
\let\repetitioncy=\pgfmathresult
\savebox{\piece}{%
\begin{tikzpicture}[overlay]
\node[blue,anchor=center] at (\repetitioncx,\repetitioncy) {\small $\circ$};
\fill[blue!80!black] (0,0) circle (0.3cm);
\fill[blue!80] (0.5,0.4) circle (0.2cm);
\fill[blue!40!green] (0.2,0.8) circle (0.25cm);
\fill[blue!60!red] (0.6,1.5) circle (0.15cm);
\end{tikzpicture}}
\begin{center}
\begin{tikzpicture}[every node/.style={anchor=center,draw=none}]
\foreach \a in {0,...,14}
\foreach \b in {0,...,5}
{
\path (0,0) ++(\repetitionax*\a,\repetitionay*\a) ++(\repetitionbx*\b,\repetitionby*\b)
node {\usebox{\piece}};
}
\end{tikzpicture}
\end{center}
\clearpage
\end{document} 