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.
— 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.
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 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.
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.
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.
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:
| stride | factor | what it is |
|---|---|---|
| 1 | 1 + 2cos 36° = φ² | inflate — one generation |
| 2 | 1 + 2cos 72° = φ | the S wheel |
| 3 | 1 + 2cos 108° = φ⁻² | deflate — exactly inverse to stride 1 |
| 4 | 1 + 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.
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 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.
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 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.
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.