Penrose Tiling
A generator written in Python
Penrose Tiling Generator is a Python application for generating P3 Penrose Tilings. Given a golden triangle, golden gnomon, rectangle or circle as input it will output a vector graphic of that shape tiled using Penrose rhombs.
The documentation is written in Markdown. Pandoc together with Tufte Pandoc CSS for styling is used to generate this html file.
The Git Repository is hosted by Sourcehut: https://git.sr.ht/~matthias_schaub/Penrose-Tiling-Generator
left to right: Golden triangle (8 generations), golden gnomon (8 generations), rectangle (10 generations) and circle (8 generation)
Note: The circle as whole is not a valid penrose tiling. It was constructed using ten golden triangles each tiled separately.
Installation
Dependencies
You do not have to install these manually. If you have Python3 and pip installed just follow the section Instruction below.
- Python 3
- svgwrite
- “Python Package to write SVG files” (GitHub Repository Description)
- Click
- “Python composable command line interface toolkit” (GitHub Repository Description)
- screeninfo
- “Fetch location and size of physical screens.”
- used for intelligent default values
Instruction
git clone https://git.sr.ht/~matthias_schaub/Penrose-Tiling-Generator
cd Penrose-Tiling-Generator
python3 -m venv venv
source venv/bin/activate
pip install .
Usage
ptg --help
Usage: ptg [OPTIONS]
A Penrose Tiling Generator.
Generates Penrose Tilings for a golden triangle, golden gnomon, rectangle
or circle shape. Output will be a SVG.
Options:
-s, --shape [triangle|t|gnomon|g|rectangle|r|circle|c]
Golden triangle (t), golden gnomon (g),
rectangle (r) or circle (c).
-b, --base FLOAT Length of the base of the golden triangle or
golden gnomon.
-w, --width FLOAT Width of rectangle.
-h, --height FLOAT Height of rectangle.
-r, --radius FLOAT Radius of circle.
--color-thick-rhombuses TEXT Hex color code for thick rhombuses.
--color-thin-rhombuses TEXT Hex color code for thin rhombuses.
-g, --generations INTEGER Number of deflation steps.
-o, --output PATH Write output to PATH instead of stdout.
-v, --verbose Enable logging to stdout.
--version Show the version and exit.
--help Show this message and exit.
All options except of shape
have default values:
base
: Monitor heightwidth
: Monitor widthheight
: Monitor heightradius
: Monitor height / 2color-thick-rhombuses
: #900C3Fcolor-thin-rhombuses
: #FFC300generations
: 6
Convert SVG to PNG (Vector to Bitmap)
Using convert (ImageMagick)
From Convert Command Manual: “The convert program is a member of the ImageMagick suite of tools. Use it to convert between image formats as well as resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more.”
# from file:
convert penrose_tiles.svg penrose_tiles.png
# from stdout:
`ptg -s t | convert svg:- penrose_tiles.png`
Using Inkscape
From the Inkscape Command Manual: “Inkscape - an SVG (Scalable Vector Graphics) editing program.”
# from file:
inkscape penrose_tiles.svg --export-area-drawing --export-area-snap --export-png penrose_tiles.png
# from stdout:
ptg -s t | inkscape - --export-area-drawing --export-area-snap --export-png penrose_tiles.png
Create a GIF
A GIF can be created using the convert (ImageMagick) command. Here is an example bash script which takes a single argument representing the resulting shape as input and generates a GIF with 10 substitutions as output:
#!/bin/bash
shape=$1
for i in `seq 1 10`;
do
ptg -s ${shape} -g ${i} |
convert svg:- penrose_${shape}_${i}.png
done
convert -delay 60 -loop 0 *.png "penrose_${shape}.gif"
rm penrose_${shape}_*.png
Background
Tiling
An informal definition of tiling is given by Senechal and Kahn 1995:
A tiling is a partition of a space into a countable number of tiles
The most familiar tilings are periodic consisting of a finite number of shapes. Those shapes are called prototiles. For example a chessboard is a square tiled using two different shapes (two prototiles), differentiated by color. The chessboard is also periodic. The means the pattern will repeat itself.
Penrose Tiling
Penrose tilings are aperiodic tilings (No translational symmetry). The tiling is self-similar which means that every finite patch occurs infinitely many times (1995: Senechal et al.).
There are three types of penrose tiling:
- P1 (original tiling)
- P2 (kite and dart tiling)
- P3 (rhombus tiling)
This software project implements rhombus tiling (P3).
Implementation
Algorithm Steps
- Generate of base triangle (Golden Gnomon or Golden Triangle) according to shape and dimensions
- Substitute base triangle and resulting triangle for every generation
- Draw a Scalable-Vector-Graphic (SVG)
- Make use of the
clipPath
andtransform
attribute
- Make use of the
Modules
- Command Line Interface:
cli.py
- General definitions:
definitions.py
- P3 Penrose Tiling:
penrose_tiling_generator.py
Classes
- Point
- Triangle (Base Class)
- GoldenTriangle (Sub Class)
- Substitution method
- GoldenGnomon (Sub Class)
- Substitution method
- PenroseP3
- List of triangles
- Substitution method
Complexity
Every Generation:
- Golden triangles are replaced by
- 1 Golden triangle & 1 golden gnomon
- Golden gnomons are replaced by
- 1 Golden triangle & 2 golden gnomons
Exponential Complexity: between O(2n) & O(3n)
Total number of triangles for each generation
Generations | Golden Triangle (#) | Golden Gnomon (#) |
---|---|---|
0 | 1 | 1 |
1 | 2 | 3 |
2 | 5 | 8 |
3 | 13 | 21 |
4 | 34 | 55 |
5 | 89 | 144 |
6 | 233 | 377 |
7 | 610 | 987 |
8 | 1,597 | 2,584 |
9 | 4,181 | 6,765 |
10 | 10,946 | 17,711 |
11 | 28,657 | 46,368 |
12 | 75,025 | 121,393 |
13 | 196,418 | 317,811 |
14 | 514,229 | 832,040 |
15 | 1,346,269 | 2,178,309 |
16 | - | - |
Existing Implementations of Penrose Tiling
Math 308 Project - Ianiv Schweber: http://www.math.ubc.ca/~cass/courses/m308-02b/projects/schweber/penrose.html
Preshing on Programming: https://preshing.com/20110831/penrose-tiling-explained/
Literature
- Gombrich, Ernst. 1979. The Sense of Order
- Senechal, Marjorie and Louise Wolff Kahn. 1995. Quasicrystals and Geometry. Cambridge University Press
- Bruijn, N. G. 1981. Algebraic theory of Penrose´s non-periodic tilings of the plane. Department of Mathematics, Eindhoven University of Technilogy