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*23*322*
22xxx
6324423332222o

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.

See also Orbifold notation (Wikipedia).

Download as: [PDF] [TEX]

Symmetries of the plane

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{\headsep}{0.25in}		% default=0.35in
\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?
    pdfmenubar=true,        % show Acrobats menu?
    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
    colorlinks=false,       % false: boxed links; true: colored links
    linkcolor=red,          % color of internal links
    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
\phantomsection\addcontentsline{toc}{chapter}{*632}%Add to PDF bookmarks
\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
\phantomsection\addcontentsline{toc}{chapter}{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
\phantomsection\addcontentsline{toc}{chapter}{*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
\phantomsection\addcontentsline{toc}{chapter}{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
\phantomsection\addcontentsline{toc}{chapter}{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
\phantomsection\addcontentsline{toc}{chapter}{*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
\phantomsection\addcontentsline{toc}{chapter}{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
\phantomsection\addcontentsline{toc}{chapter}{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
\phantomsection\addcontentsline{toc}{chapter}{*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
\phantomsection\addcontentsline{toc}{chapter}{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*
\phantomsection\addcontentsline{toc}{chapter}{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;
\fill[red] (-0.5,0.6) arc[start angle=90,end angle=-90,x radius=0.2cm,y radius=0.3cm];
\fill[red] (0.5,0.6) arc[start angle=-90,end angle=90,x radius=0.17cm,y radius=0.21cm];
\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
\phantomsection\addcontentsline{toc}{chapter}{22\texttimes}
\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
\phantomsection\addcontentsline{toc}{chapter}{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

%**
\phantomsection\addcontentsline{toc}{chapter}{**}
\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
\phantomsection\addcontentsline{toc}{chapter}{*\texttimes}
\def\repetition{2.0}
\def\miraclelength{0.5}
\savebox{\piece}{%
\begin{tikzpicture}[overlay]
\draw[red,fill=red!10,rounded corners] (0,0) -- (1.0,1.0) arc[start angle=0,end angle=180,x radius=0.5cm,y radius=0.5cm];
\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
\phantomsection\addcontentsline{toc}{chapter}{\texttimes\texttimes}
\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
\phantomsection\addcontentsline{toc}{chapter}{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}

Comments

  • #1 mahdi, October 28, 2013 at 10:16 p.m.

    very interesting!! :)

Adding comments is currently not enabled.