%% $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}