By your bootstraps

Generate a whole Penrose tiling from a single tile

penrose-mosaic holds four wheels and eight tile outlines, every one of them found by hand on quadrille paper in the 1990s and typed in as coordinates. This page keeps five ordered lattice points — the corners of one pentagon — and derives the rest. Drag a corner and the tiling follows, because nothing downstream holds a coordinate of its own.

Left: the five points, draggable, with the controls that make them and the patch. Right: the tiling they generate. Extrapolate walks the pentagon up and down the wheel ladder in half generations — 0 is the five themselves — and use adopts whatever is shown as the new five. Everything below is how it works.

preset
extrapolate 0
face
edges

patch
fifths
gen 2
rhombs
rhomb face
rhomb edges
rhomb wheels

— scroll to zoom, drag to pan, double-click to fit

The five points are the pentagon pentaUp, and they are ordered. That is the whole lever: the order is the rotation operator, so a rotation is an index shift and nothing else. There is no reflection anywhere in the derivation — no vr, no hr, no table of stored rotations — which is what lets the five points be asymmetric. Move one and the figure stops being mirror symmetric; everything still works.

Step 1 — the pentaflake, and measuring P off it

The wheels are not given. They are measured off a figure you build, and this is the figure. Jake's construction:

Copy 1 2 3 4 5. Rotate the copy 180° through O. Put it so that edge 12 touches 21; the next copy so 23 touches 32, then 34–43, 45–54, and 51 touches 15. That is a pentaflake. All the copies are yellow. The first value of your P wheel (gen 1) will be O to O1, O to O2, etc.

Rotating 180° through O sends corner j to −pts[j]. For the copy's edge (k+1 → k) to land on the original's edge (k → k+1), the copy must move by T, and both corners give the same T — which is what makes the edges coincide rather than merely abut:

  −pts[k+1] + T = pts[k]        and        −pts[k] + T = pts[k+1]

  so   O_k  =  pts[k] + pts[k+1]

A P vector is the two corners of the shared edge, added. That is the measurement, and it needs no wheel, no formula and no reflection — only that the list is ordered.

the pentaflake — the middle pentagon, the five 180° copies, the shared edges, and the dashed spokes O → Ok that are the P wheel

The five leaf centers land on the odd tenths of P — the down half — because a leaf is the 180° copy and faces the other way. The even tenths are the same construction run on a leaf, which is the flake seen from one of its own petals. Ten directions, one figure.

And this is why P[t] = D[t−1] + D[t+1] holds: at an odd tenth, that stride-1 pair is the two corners of a shared edge. The formula is the pentaflake written down, not an algebraic coincidence.

The other preset: a regular pentagon

Nothing here needs the lattice. The wheels, the walks, the substitution and the rhombs are arithmetic on pairs of numbers, and the integers are only what the quadrille happens to use. So the second preset is the regular pentagon, centered on the origin with side 4 — the normalization that makes it comparable, since the quadrille's three edge lengths are 4, √13 and √17 and this is what they are approximating. Its circumradius is 4 / (2 sin 36°) = 3.402603, against the quadrille's 3.

  quadrille  (0,-3)      (3,-1)      (2,3)      (-2,3)      (-3,-1)
  real       (0,-3.403)  (3.236,-1.051)  (2,2.753)  (-2,2.753)  (-3.236,-1.051)

  sides      quadrille  3.606  4.123  4.000  4.123  3.606
             real       4.000  4.000  4.000  4.000  4.000

Fed through the same code it lands on Euclidean Penrose exactly and at once — thick 72°, thin 36°, at every generation, with no convergence at all, because a regular pentagon is already the substitution's fixed point. The quadrille has to climb toward 69.287628° and 37.724519° and never reaches 72°. The edge wheel tells the same story in one number: the real pentagon has one edge length, the quadrille three.

Snap to the lattice is on for the quadrille and off for the real preset — rounding an irrational pentagon's corners onto the paper on the first drag would silently turn it back into a quadrille. The box is yours to override either way. The output pans and zooms: scroll over it, drag it, double-click to fit.

The ladder, in half steps and below zero

A generation is φ² — two Penrose deflations — so the natural index is the half. Turn the slider on the input figure and the pentagon walks it:

  gen   D seeds (tenths 0, 1, 2)      |D[1]|
  -1    (0,1)   (1,-1)   (0,-1)      1.414
 -0.5   (0,-2)  (0,0)    (1,0)       0.000   ← a seed on the origin
    0   (0,-1)  (1,-1)   (1,-1)      1.414
  0.5   (0,-2)  (1,-2)   (2,0)       2.236   ← last rung with every coordinate positive
    1   (0,-3)  (2,-3)   (3,-1)      3.606   ← the five points
  1.5   (0,-6)  (3,-4)   (5,-2)      5.000   ← which is the P wheel at generation 1
    2   (0,-9)  (5,-7)   (8,-3)      8.602
  2.5   (0,-14) (8,-12) (13,-4)     14.422

So the half rung above D is P, exactly — the four wheels were always three consecutive half rungs of one ladder, and naming them D, P and T is what hid it. Whole rungs are reached by inflating or deflating from the seed and half rungs by one φ step from the whole rung below; never by composing half steps, because two φ steps are not one generation. They miss by the alternating (0, ±1) that is My's λ = −1, and the error would pile up. That gap is the same one that makes T and the next generation's D two different integer wheels on one rung.

Downward the ladder is two-sided but not symmetric. Generation ½ is the last rung that reads as a figure. At −½ a seed collapses onto the origin — the deflation running out of wheel, not a numerical accident — and below that the conjugate root ψ = −1/φ takes over, the coordinates alternate in sign and the pentagon turns inside out. Every rung stays exactly on the lattice; it just stops being a pentagon.

What comes out of the five

Three unit vectors a turn apart sum to (1 + 2cos turn) times the middle one, and on a ten-wheel the turn is the stride. So one operator, W[t−k] + W[t] + W[t+k], gives the whole ladder:

stridefactorwhat it is
11 + 2cos 36° = φ²inflate — one generation
21 + 2cos 72° = φthe S wheel
31 + 2cos 108° = φ⁻²deflate — exactly inverse to stride 1
41 + 2cos 144° = −φ⁻¹the conjugate root, ψ

Drop the middle term of the stride-1 sum and 2cos 36° = φ gives P; difference the same pair instead of summing it and you get E, the tile edges — which for the quadrille seed come out as the (4, 0), (3, 2), (1, 4) basis the whole construction was doodled from. T is S + D. Four hand-built arrays, one line each, and every one of them checked against penrose-mosaic's own numbers at generations 0, 1 and 2.

Tiles are closed walks

A tile outline is a list of tenths in E, not a list of coordinates. Rotating it is adding to every entry. That is why the eight stored arrays collapse to four:

  penta     1 3 5 7 9          star      2 0 4 2 6 4 8 6 0 8
  boat      2 0 4 5 6 0 8      diamond   2 3 7 8

  boatWon = turn(boat, 1)      diamondWon = turn(diamond, 1)
  boatToo = turn(boat, 2)      diamondToo = turn(diamond, 2)

The shift is exact in the index. It is not exact in the metric: boatWon has a √13 edge where boatUp has a 4, because the wheel's ten spokes are not the same length. That is the quadrille's character in one line — the combinatorics are exact and the metric is whatever the lattice can manage at that angle.

The rhombs, and a spelling that matters

The P3 overlay walks in the wheels rather than in E. penrose-mosaic builds it as three steps from a corner, the fourth closing — in real geometry every step is a T vector. In quadrille its first step is spelled P + D instead, which is inflate(D): also ×φ², but the other integer representative of that rung. The two differ by the alternating (0, ±1) that is My's λ = −1 eigenvalue.

Because W[k+5] = −W[k], a figure spelled in one wheel has its first and third steps exactly opposite and its closing edge exactly opposite its second — an exact parallelogram, for any five points, and a true rhomb wherever the wheel's spokes agree. Mixing the two spellings loses even that:

  real, all four on T              1.000 1.000 1.000 1.000   rhomb
  quadrille, all four on T         9.434 9.434 9.434 9.434   rhomb at this tenth
  quadrille, all four on D + P     8.602 8.602 8.602 8.602   rhomb at this tenth
  quadrille, penrose-mosaic's mix  8.602 9.434 9.434 8.602   kite

The overlay switch above draws all three. penrose-mosaic's own source flags the line — the comment above goThickReal wonders whether the modes can be unified “if the real of d + p == t”. They cannot, and this is what the difference does. Which spelling the tiling actually wants is not settled here; the kite may be registering against the P1 pentagons deliberately.

Generations, and the diamond space

A single tile is gen 1; the pentaflake above is a Pe5 gen 2. A figure's generation is its parts' plus one, which agrees with the wheel numbering — the seed at index 1. Measured:

  Pe5 gen 2  =  1 Pe5 + 5 Pe3                        the pentaflake
  Pe3 gen 2  =  1 Pe5 + 3 Pe3 + 2 Pe1 + 1 St1        three yellow, two orange
  Pe1 gen 2  =  1 Pe5 + 1 Pe3 + 4 Pe1 + 2 St1
  St1 gen 2  =  1 St5 + 1 Pe1 + 1 St3

A Pe3 gen 2 is the smallest figure with a diamond-shaped hole in it, between its two orange pentagons. Place the tiles and the hole is (0, 3) (1, 7) (0, 11) (−1, 7) — and the St1 the substitution puts there is that polygon exactly. The space and the tile coincide, so the diamond can be measured rather than transcribed.

All four of its sides are √17: it is a genuine rhombus, and a rhombus has a symmetry that swaps its two tips. So the outline alone cannot say which tip carries the tile's reference point — the tips really do look alike, and looking harder will not help. What is true at every diamond tested, on a skew seed as well, is that the reference lies on the long diagonal splitting it

  |p[gen−1]| : |p[gen]|      2 : 6 at generation 2,  →  1 : φ²

— never the midpoint and never a corner. Counting how many pentagons meet at each tip does not settle it: right 40 times out of 40 on a Pe5 patch, and a coin toss (60/60) on a Star patch. The information is not local to the diamond; it comes from whichever parent placed it. Whether a local rule exists at all is open.

Big rhombs, small rhombs, and the rung between

Big and small rhombs are one whole generation apart — φ², two Penrose deflations — which is what goThick(wheels, exp) at exp 0 and 1 means. With the ladder in halves, the rung between them is reachable too: the Robinson level the φ² construction skips. There is a genuine rhomb at every φ step. The rhomb rung slider above offsets the overlay from the tiles it sits on.

The low rungs give out, and not together. At generation 0 the thick rhomb is a square; at generation ½ the thin one has collapsed to a straight line, 180° and 0°, with no interior at all. So the thin's floor sits a half rung above the thick's — the same lopsidedness the wheel ladder has on the way down.

And the angles do not converge on Penrose's. Carried out far enough they settle, to six decimals, on

  thick acute  →  69.287628°   =  2 × 34.643814°
  thin  acute  →  37.724519°   =  180° − 2 × 71.137740°

  Euclidean P3 would be 72° and 36°.

34.643814° and 71.137740° are exactly this construction's own limiting directions. Both rhomb angles are fixed by those two, as they must be since a rhomb's edges are wheel vectors — but it is the first time that has been measured on the tiles rather than on the directions. The quadrille is not a rational approximant creeping toward Penrose. Its rhombs settle on their own angles and stay there.

What is constructed, and what is still borrowed

Constructed: P, off the pentaflake. The pentagon outline, as D[t], D[t+2], D[t+4], D[t+6], D[t+8] — the D wheel at stride 2 about its center, which needs no stored walk and gives exactly two polygons over the ten tenths, the five points and their negatives. The anchors, which are D[t] for a pentagon and P[t] for the whole star family. And the diamond space, as the measured gap.

Still borrowed: the star, boat and diamond walks, and the twist/diamond substitution lists saying how a Pe3 breaks into its children — now the largest transcribed thing in the module. S and T are verified identities but have no figure behind them the way P does; until they do they are description rather than derivation. See NOTES.

Everything drawn here is checked against penrose-mosaic in tools/bootstrap.test.mjs — the wheels at three generations, all eight stored tile arrays, the rhomb spellings, and the 55 and 35 rhomb counts of the Sun and Star patches.