workshop private

← all creations

Half Again

mechanics · created 2026-10-01

A domino amplifier, where energy says each one could be 2.90× the last, the collision says 1.56×, and the same 1.5× finishes 14 builds out of 25 at one spacing and 25 out of 25 at another — the gap nobody thinks about doing all the work.

physicsgame-feelsimulationcanvas

Everybody has seen the video: a tile the size of a grain of rice goes over, and thirteen dominoes later something the size of a door does. The number attached to it is half again — each domino can knock over one about 1.5× its own size — and it is quoted as though it were a law. It is not. It is a working number, several per cent under a ceiling that is set by geometry, and the interesting thing about building one of these is not the growth factor at all.

Three numbers, and the one everybody quotes is not the ceiling

A domino of height h and thickness t has to be lifted onto its own corner before gravity will take it the rest of the way. Both energies are pure geometry:

barrier  =  m·g·(√(h²+t²) − h) / 2        standing → balanced
release  =  m·g·(√(h²+t²) − t) / 2        balanced → flat

Mass goes as h³ and the lever as h, so both scale as h⁴ and their ratio does not scale at all:

heightmassbarrier to balancereleased after itratio
6 mm0.0194 g6.90e-9 J4.88e-7 J70.8
48 mm9.92 g2.82e-5 J2.00e-3 J70.8
1000 mm89.7 kg5.32 J377 J70.8

One domino carries 70.8× the energy needed to start the next one, across five decades of size, and since energy goes as h⁴ that licenses a growth factor of 70.8^(1/4) = 2.90×. Every domino could topple one nearly three times its height, if the energy could be delivered.

It cannot, and src/half-again.mjs is there to say by how much. Each domino is one degree of freedom — an angle about its own front bottom edge — with inelastic contact and Coulomb friction between the falling corner and the face it slides up. That model buys two exact facts, and they are the whole piece:

a normal push on the back face, τ up from the floor,
has moment arm exactly τ about the pivot           →  hit low, get nothing

the falling domino's corner pushes with moment arm
h₁·cos(a₁ − a₂) about its own pivot                →  and the two must agree

The second number is the measured one: 1.56×, at the best spacing there is. Folklore’s 1.5 is not the ceiling. It is about four per cent under it, which turns out to be exactly the right place to be.

The chain has no memory, and that is not a metaphor

A row where every domino is g times the last and every gap is λ times the falling one is scale-invariant: scale the picture by g and you have the same row, one step along. So the only honest way to read the arrival speed is the one form that survives that scaling, ŵ = ω·√(h/g) — and in that form a row has a fixed point it goes to no matter how it was started.

flick ŵ#1#2#3#4#5#6#7#8tail
0.250.480.760.971.081.131.161.171.171.172
1.201.270.951.031.101.151.161.171.181.173
16.0016.017.554.873.132.151.611.361.251.183

A flick carrying 4000× the kinetic energy of another is gone in six dominoes. You cannot shove a chain into working. Every step pays for itself out of its own fall, which is why the demo’s camera zooms with the wave — at constant growth the view is identical at every step, because the physics is.

The demo makes this the main view on purpose. The thing people expect to see is a chain getting more impressive; what you actually watch is the same event fourteen times, with the ruler underneath changing units.

Spacing has two optima and they are at opposite ends

λ = gap/hpitcharrival ŵ*wave speedresting angles
0.1012.3 mm0.3490.58 m/s59/61/63/66/69/75°
0.2017.1 mm0.7060.72 m/s65/65/66/67/68/70°
0.3021.9 mm0.9220.75 m/s70/70/70/70/71/71°
0.5031.5 mm1.1740.72 m/s76/76/76/76/76/76°
0.7041.1 mm1.3130.66 m/s79/79/79/79/79/79°
0.9050.7 mm1.3420.54 m/s90/90/90/90/90/90°

Two things worth stopping on. The wave speed peaks around λ = 0.30 at 0.75 m/s — in the right neighbourhood for a real 48 mm domino — while the growth ceiling, below, peaks at λ = 0.96. Fastest and strongest are not the same spacing and they are not close.

And the resting angles, which are the tell. I expected a tight row to stall and it never does: it goes down leaning, every domino propped on the one in front, finishing in the sixties rather than flat. The push is still travelling; it is just arriving from a domino that has barely started to fall. That has an exact bound. A domino can lean at most asin(λ) before its corner lands on the next face, and it needs atan(t/h) = 8.87° just to pass its own balance point:

λasin(λ)measured lean at first touchpast balance by then?
0.105.74°5.86°no
0.158.63°8.77°no
0.2011.54°11.68°yes
0.7044.43°44.43°yes

The simulator finds that limit to within 0.24° without being told it, which is the check I trust most in the whole file — and the error is one-sided, always a fraction of a degree past asin(λ), because contact is detected at the end of a timestep rather than during one. Below sin(8.87°) = 0.154 no domino in the row can reach its own balance point while its neighbour stands — the row can only be shoved along as a block.

The ceiling, measured

λg_maxdominoes 6 mm → 1.1 mreach left over
0.181.180320.82
0.301.292210.70
0.501.411160.50
0.701.500130.30
0.881.530130.12
0.961.564120.04
0.981.553120.02

Half again is not available at all below λ = 0.70. The curve climbs to 1.564 and then turns over, because the gap is approaching the only hard wall in the problem: at λ = 1 the falling domino’s corner stops reaching the next face. The best growth in the game sits where there is 4% of reach left over.

One definition matters more than it looks. I first measured this over seven-domino ladders and published a ceiling several per cent too high, because a ladder a little over its ceiling does not die at the second domino. At λ = 0.75, where the ceiling is 1.502:

of ceilingg#1#3#5#7#9#11#13dies at
96%1.4411.7551.0881.0771.0761.0711.0721.075runs
100%1.5021.7911.0851.0851.0811.0781.0761.075#14
102%1.5321.8091.0901.0861.0831.081——#9
104%1.5621.826——————#2
112%1.6821.895——————#2

I expected the 102% row to show a slow bleed, and it does not. The arrival speed holds inside one per cent for eight dominoes and then the ninth does not go over. The self-similar state is not one number — the contact height and the phase of the domino behind are in it too — so a per cent of drift in the one number you can watch is the whole margin, at the ceiling. There is no early warning available, which is the single most load-bearing fact in the piece: “it knocked the next one over” is not evidence about a step. The 104% row knocks its first domino down perfectly well and stops.

So maxGrowth runs thirteen dominoes, and the demo’s shipped CEILING table is re-measured by scripts/measure.mjs, which fails if it has drifted.

What a chain at its ceiling is actually worth

Twenty-five builds of the same ladder, 2% of slop in every gap and 20% in the flick — roughly what a careful hand on a real table manages:

λgof ceilingdominoescompleteddied at
0.601.39896%1725/25—
0.601.44299%168/25#10,#11,#13,#14,#15
0.601.456100%151/25#4,#5,#7,#9,#10,#12,#13,#14
0.881.46996%1525/25—
0.881.530100%148/25#11,#12,#13
0.961.50196%1425/25—
0.961.564100%1312/25#11,#12

Four per cent of headroom costs one domino and buys all of it back. The cliff is that sharp because the ladder is self-similar: at the ceiling every step is equally marginal, so a fourteen-domino chain is fourteen coin flips, and the deaths scatter through it instead of piling up anywhere. There is no step to go and fix, and — per the table above — no reading you could have taken at #12 that would have told you. The thing that killed it at #13 is the growth factor you chose at #1.

The row that makes the point

Same growth factor, same count, same final height, different gap:

planλgdominoesfinaltable usedcompleted
greedy0.961.56413129 cm273 cm12/25
peak, backed off0.961.50114118 cm280 cm25/25
half again, λ 0.750.751.50014117 cm229 cm14/25
half again, λ 0.880.881.50014117 cm259 cm25/25
timid0.501.18033120 cm453 cm25/25

Those two middle rows are the same build by every measure a builder would write down. One of them completes 14 times out of 25 and the other 25 out of 25, and the only difference is 30 cm of extra table. At λ = 0.75 the ceiling happens to be 1.502, so “half again” is sitting at 99.9% of it; at λ = 0.88 the ceiling is 1.530 and the identical chain has room. The growth factor is the number everyone argues about and the gap is the one doing the work.

That is what the demo is for. You set growth with ▲ ▼ and the gap with ◀ ▶, and the instrument under the table plots the measured ceiling with every step you have placed sitting against it. test ×25 is the only honest score: once is not the same as reliably, and a chain that finished once will tell you nothing about which it was.

The clock, which is the only thing not self-similar

stepheighttipped atsince lastin √(h/g)
#420 mm0.295 s0.146 s3.22
#8103 mm1.303 s0.352 s3.45
#11346 mm2.801 s0.556 s2.96
#13778 mm4.505 s0.972 s3.45

Every step takes 3.24·√(h/g), flat to ±10% over the whole ladder — so each one takes √g ≈ 1.22× as long as the last, and half of a 4.5-second run is the last three dominoes (the last two are 38%). The geometry repeats; the clock does not. It is the one cue in the demo that tells you how far along you are, since the picture deliberately will not.

What is physics here and what isn’t

Reuse

src/half-again.mjs is framework-free with no canvas in it.

Port notes: the whole integrator is scalar — one angle and one angular velocity per body, and two scalar impulses per contact — normal, then friction clamped against it — with no vectors and no matrices anywhere. It translates into a tick method directly. The one thing not to change casually is DT (1/3000 s): the contact is stiff and the entire result is an impulse transfer.

The demo bundles its own copy of the module (ADR-0002) — if you touch src/, re-copy it into demo/. node scripts/screenshot-demo.mjs regenerates the thumb and media and doubles as the smoke test: it drives the real keyboard, then builds the same chain at the ceiling and 4% under it and asserts the first is a coin flip and the second is not.