%% $Id: pst-hypertiling-doc.tex 1268 2026-05-31 08:30:15Z herbert $
\DocumentMetadata{lang=en}
\documentclass[11pt,english,BCOR10mm,DIV12,bibliography=totoc,parskip=false,
   smallheadings, headexclude,footexclude,twoside]{pst-doc}

\usepackage{pst-hypertiling}
\let\pstFV\fileversion

\addbibresource{\jobname.bib}

\usepackage{enumitem,xltabular,hvindex,hvlogos,minted-code}
\setlist{nosep}

\usepackage{makeidx}
\makeindex

\def\bgImage{\psset{unit=3,polygones,polygoncolor=red,polygonbasecolor=red,colorA=yellow,colorB=blue,polygonwidth=0.4pt,polygonbasewidth=0.5pt}
\begin{pspicture}[showgrid=false](-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[type=Reflect,np=6 4,ni=4]
\end{pspicture}}

\begin{document}

\title{Hyperbolic Tilings with PSTricks}
\subtitle{Plotting hyperbolics; v.\pstFV}
\author{Manuel Luque \\ Herbert Voß}
\docauthor{}
\date{\today}

\settitle

\tableofcontents

\clearpage

\begin{abstract}
In hyperbolic geometry, a uniform hyperbolic tiling (or regular, 
quasiregular or semiregular hyperbolic tiling) is an edge-to-edge filling of the hyperbolic plane which has regular polygons as faces and is vertex-transitive (transitive on its vertices, isogonal, i.e. there is an isometry mapping any vertex onto any other). It follows that all vertices are congruent, and the tiling has a high degree of rotational and translational symmetry.
This subject is extensively covered on the Internet, featuring 
some remarkable examples. This modest contribution, created using 
PSTricks, offers a simple way to customize your own designs.~\cite{wikipedia}
\end{abstract}%


\section{Introduction}

This study draws upon the outstanding document by Patrick Fradin:
\url{http://melusine.eu.org/syracuse/texgraph/exemples/hpavages/}.~\cite{fradin}
The hyperbolics are really big, which is the reason why this document is 
about 15 MByte
when you run it without using  external png images. 

Runing it with \Lprog{lualatex} needs some time in fact of the heavy calculations.

The \Lpack{pst-hypertiling} package is dedicated to the tiling of the 
\Index{Poincaré disk}; in the future, it may potentially be expanded to include 
other construction elements of hyperbolic geometry within this disk. 
There already exist numerous superb implementations regarding this subject. 
The document that served as my guide while writing this package is the one by
Patrick Fradin.~\cite{fradin}

%It is remarkable in every respect: covering hyperbolic geometry, 
%the underlying calculations, and the examples created using the 
%\TeX{}graph software. You can follow a discussion on this topic 
%on the \TeX{}graph forum:
%\url{http://texgraph.tuxfamily.org/forum/index.php}

\section{Using the \Lpack{pst-hypertiling} package and its parameters}
There is only one command, \Lcs{psHypertiling}, the options (or parameters) for 
which are listed below.
\begin{itemize}[nosep]
\item The polygon type: \LKeyword{np=6 4}. This specifies, in order, 
the number of sides of the polygon (n) and the number
of polygons (p) surrounding a common vertex. The following condition 
must be satisfied:

\[ \frac1n + \frac1p < \frac12 \]

The proof for this is included in \cite{fradin}.
\item The polygon fill patterns: \Lkeyword{motifA} and \Lkeyword{motifB}.

\begin{center}
\psset{unit=2.5}
\begin{pspicture}[showgrid=false](-1,-1)(1,1)
  \psframe*(-1,-1)(1,1)
  \pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
  \psHypertiling[np=7 4,ni=0,motifA=false,polygones]
\end{pspicture}
\begin{pspicture}[showgrid=false](-1,-1)(1,1)
  \psframe*(-1,-1)(1,1)
  \pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
  \psHypertiling[np=7 4,ni=0,motifB=false,polygones]
\end{pspicture}

\begin{codeblockA}[title=\Lkeyword{motifA} and \Lkeyword{motifB},breakable]
\psset{unit=2.5}
\begin{pspicture}[showgrid=false](-1,-1)(1,1)
  \psframe*(-1,-1)(1,1)
  \pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
  \psHypertiling[np=7 4,ni=0,motifA=false,polygones]
\end{pspicture}
\begin{pspicture}[showgrid=false](-1,-1)(1,1)
  \psframe*(-1,-1)(1,1)
  \pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
  \psHypertiling[np=7 4,ni=0,motifB=false,polygones]
\end{pspicture}
\end{codeblockA}
\end{center}

We can display both using different colors, display one 
without the other, or display neither.

\item The number of iterations: \LKeyword{ni=3}. The higher this number, 
the longer the calculation time will be. To fill the disk without 
discernible gaps, the number of iterations chosen depends on the 
type of polygon; generally, a value of 4 to 5 suffices. Here, for 
example, is the result obtained with an iteration count ranging from 1 to 4.


\begin{center}
\psset{unit=2.5}
\begin{pspicture}[showgrid=false](-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[np=7 4,ni=1,motifA=false,polygones,polygoncolor={[rgb]{0.0 0.5 0}},polygonbasecolor={[rgb]{0.0 0.5 0}}]
\end{pspicture}
\begin{pspicture}[showgrid=false](-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[np=7 4,ni=2,motifA=false,polygones,polygoncolor={[rgb]{0.0 0.5 0}},polygonbasecolor={[rgb]{0.0 0.5 0}}]
\end{pspicture}

\begin{pspicture}[showgrid=false](-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[np=7 4,ni=3,motifA=false,polygones,polygoncolor={[rgb]{0.0 0.5 0}},polygonbasecolor={[rgb]{0.0 0.5 0}}]
\end{pspicture}
\begin{pspicture}[showgrid=false](-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[np=7 4,ni=4,motifA=false,polygones,polygoncolor={[rgb]{0.0 0.5 0}},polygonbasecolor={[rgb]{0.0 0.5 0}}]
\end{pspicture}

\begin{codeblockA}[title=Iteration number,breakable]
\psset{unit=2.5}
\begin{pspicture}[showgrid=false](-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[np=7 4,ni=1,motifA=false,polygones,polygoncolor={[rgb]{0.0 0.5 0}},polygonbasecolor={[rgb]{0.0 0.5 0}}]
\end{pspicture}
\begin{pspicture}[showgrid=false](-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[np=7 4,ni=2,motifA=false,polygones,polygoncolor={[rgb]{0.0 0.5 0}},polygonbasecolor={[rgb]{0.0 0.5 0}}]
\end{pspicture}

\begin{pspicture}[showgrid=false](-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[np=7 4,ni=3,motifA=false,polygones,polygoncolor={[rgb]{0.0 0.5 0}},polygonbasecolor={[rgb]{0.0 0.5 0}}]
\end{pspicture}
\begin{pspicture}[showgrid=false](-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[np=7 4,ni=4,motifA=false,polygones,polygoncolor={[rgb]{0.0 0.5 0}},polygonbasecolor={[rgb]{0.0 0.5 0}}]
\end{pspicture}
\end{codeblockA}
\end{center}

\item You can choose the type of transformation to apply to generate the tiling:

\begin{itemize}
\item Symmetry with respect to the midpoints of the sides of the base 
polygon—using the option \Lkeyset{type=SymMiddle}--
which is the default option; or:
\item Reflection across the sides of the base polygon—using \Lkeyset{type=Reflect}. 
The difference is illustrated in the
drawings below.

\begin{center}
\psset{unit=2.5,polygones,polygoncolor=red,polygonbasecolor=red,colorA=yellow,colorB=blue,polygonwidth=0.4pt,polygonbasewidth=0.5pt}
\begin{pspicture}[showgrid=false](-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[np=6 4,ni=4]
\end{pspicture}
\begin{pspicture}[showgrid=false](-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[type=Reflect,np=6 4,ni=4]
\end{pspicture}

\begin{codeblockA}[title=Transformationtype,breakable]
\psset{unit=2.5,polygones,polygoncolor=red,polygonbasecolor=red,
   colorA=yellow,colorB=blue,polygonwidth=0.4pt,polygonbasewidth=0.5pt}
\begin{pspicture}[showgrid=false](-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[np=6 4,ni=4]
\end{pspicture}
\begin{pspicture}[showgrid=false](-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[type=Reflect,np=6 4,ni=4]
\end{pspicture}
\end{codeblockA}

\end{center}

\item The precision of the drawing can be adjusted using the option 
\LKeyword{subdiv=5}. For a basic polygon with a small number of sides, 
a higher number of subdivisions (10, for example) should be chosen to 
ensure that the arcs are drawn perfectly.

\begin{center}
\psset{unit=5}
\begin{pspicture}(-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[subdiv=10,np=3 12,ni=6,polygoncolor={[rgb]{0.0 0.5 0}},
  polygonbasecolor={[rgb]{0.0 0.5 0}}]
\end{pspicture}
\end{center}

\begin{codeblockA}[title=Option \Lkeyword{subdiv},breakable]
\psset{unit=5}
\begin{pspicture}(-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[subdiv=10,np=3 12,ni=6,polygoncolor={[rgb]{0.0 0.5 0}},
  polygonbasecolor={[rgb]{0.0 0.5 0}}]
\end{pspicture}
\end{codeblockA}
\end{itemize}

%\item The precision of the drawing can be adjusted using the option 
%\LKeyword{subdiv=5}. For a basic polygon with a small number of sides, 
%a higher number of subdivisions (10, for example) should be chosen to 
%ensure that the arcs are drawn perfectly.


\item Four Boolean parameters control whether or not to draw the 
triangular patterns (individually or together), the polygons, and
the base polygon.
\begin{description}
\item[\Lkeyword{motifA}], default: [true];
\item[\Lkeyword{motifB}], default: [true];
\item[\Lkeyword{polygons}], default: [true];
\item[\Lkeyword{polygonebase}], default: [true].
\end{description}

\item Plotting parameters: line color and thickness:
\begin{description}
\item[\LKeyword{colorA={[rgb]{0.75 0 0.25}}}], for motifA.
\item[\LKeyword{colorB={[rgb]{0.25 1 0.75}}}], for motifB.
\item[\LKeyword{polygonbasecolor=red}], for drawing the base polygon.
\item[\LKeyword{polygoncolor=red}], for drawing the polygons.
\item[\LKeyword{polygonbasewidth=1.5pt}], for the line thickness of the base polygon.
\item[\LKeyword{polygonwidth=0.8pt}], for the line thickness of the polygons.
\end{description}
\end{itemize}

\section{Examples}

\begin{center}
\psset{unit=2.5}
\begin{pspicture}(-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[np=7 3,ni=4,motifA=false,motifB=false,polygones,polygoncolor=black,polygonbasecolor={[rgb]{0.0 0.5 0}}]
\end{pspicture}
\begin{pspicture}[showgrid=false](-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[ni=5,motifA=false,motifB=false,polygones,polygoncolor=black,polygonbasecolor=red]
\end{pspicture}

\begin{pspicture}(-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor=red,fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[np=5 4,ni=5,polygonbasewidth=0.8pt,polygonwidth=0.4pt,polygonbasecolor=blue,
polygoncolor={[rgb]{0.0 0.5 0}},colorA={[rgb]{1 0.5 0}},colorB={[rgb]{0.0 0.99 0.5}},polygones]
\end{pspicture}
\begin{pspicture}(-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor=red,fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[np=4 8,subdiv=10,ni=5]
\end{pspicture}

\begin{codeblockA}[title=Color setting,breakable]
\psset{unit=2.5}
\begin{pspicture}(-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[np=7 3,ni=4,motifA=false,motifB=false,polygones,polygoncolor=black,polygonbasecolor={[rgb]{0.0 0.5 0}}]
\end{pspicture}
\begin{pspicture}[showgrid=false](-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor={[rgb]{0.0 0.5 0}},fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[ni=5,motifA=false,motifB=false,polygones,polygoncolor=black,polygonbasecolor=red]
\end{pspicture}

\begin{pspicture}(-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor=red,fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[np=5 4,ni=5,polygonbasewidth=0.8pt,polygonwidth=0.4pt,polygonbasecolor=blue,
polygoncolor={[rgb]{0.0 0.5 0}},colorA={[rgb]{1 0.5 0}},colorB={[rgb]{0.0 0.99 0.5}},polygones]
\end{pspicture}
\begin{pspicture}(-1,-1)(1,1)
\psframe*(-1,-1)(1,1)
\pscircle[linecolor=red,fillstyle=solid,fillcolor=yellow!20]{1}
\psHypertiling[np=4 8,subdiv=10,ni=5]
\end{pspicture}
\end{codeblockA}
\end{center}

\clearpage


\section{List of all optional arguments for \texttt{pst-hyperbolic}}

\xkvview{family=pst-hyptil,columns={key,type,default}}

\bgroup
\raggedright
\nocite{*}
\printbibliography
\egroup

\printindex

\end{document}