RangeBlends · Two ladders, opposite jobs

The Other Ladder

Everything on this site is built from a binary ladder over a number's structure. There are two of them, and they were designed for opposite ends. One is uneven, so structure survives it and you can walk on the result. The other is perfectly regular, so structure dies in it — which is the entire point, because it was built to whiten. This page is what happens when you point the second at the first.

The ruler ladder — uneven on purpose

run(g) grouped by v₂(g+1). The steps are ragged, and the ragged part is the landscape.

Three jumps of +6, +8 and +5 where a plain ruler would step by one. Those are whole scale classes appearing at once, and they are why Range has mountain classes and Rivers has confluences where the river abruptly doubles.

The square ladder — even on purpose

The spine of v → isqrt(v), repeated. Bit lengths, top to bottom.

Every step is exactly a halving. Nothing to catch on, nothing to see. A 2048-bit input splits into 386 leaves, and every one of them lands at depth 8 or 9 — there is no scale hierarchy anywhere in it. Feed this to a terrain generator and you get a plain. That is not a failure; it is what a whitener is for.

exact

The bias, derived

Almost everything on this site is measured. This one is derived first, then confirmed — and the confirmation is an exact count, not a sample.

the claim dev(a) = (2a + 1 − q) / R enumerated — largest disagreement —

Why the ramp is worth keeping

indexrng's square backend sets SKIP = 32 to throw the isqrt root branch away, because it carries this ramp and a generator must not have one.

A ramp is a defect in a generator and a gradient in a world. So on the next panel it is kept, and used to slide each peak of the ruler off its slot — by an amount that is not random and has a closed form.

Every other warp in procedural generation is statistically opaque: you perturb with noise and you cannot say how far anything moved. Here (2a+1−q)/R says exactly.

What it did, and what I got wrong

The prediction was that a warp would break the lattice — Range's one honest weakness, that peaks sit on 2-divisible indices. It does the opposite.

layerpeaksspreadlattice
none750.2020.512
hash 0.251050.2090.456
square 0.45780.2360.621
square 0.80360.2510.573

A ramp is coherent, so neighbouring peaks slide together and the periodicity survives. What it does instead is differentiate: 75 peaks merge into 36 and the height classes separate by 24%. The hash layer decorrelates; this one sharpens. They are not interchangeable, and combining them lands mid-table on both axes rather than adding up.

the world

Same seed, three settings

Top to bottom: no layer, 0.45, 0.80. Watch the peaks gather rather than scatter.

massif 0.00 · 0.45 · 0.80 seed calcasieu — and none of the three stores a byte

Try it live on Ruler Range →  ·  the object itself: The Edge Run →

The square split is v → (isqrt(v), v − isqrt(v)²), taken to leaves. The rem branch is a bijection onto [0, 2r] — exact, no analysis — so all of its error comes from blocks having different lengths and nowhere else. The root branch is the one plotted above. Both, and the degree doubling d → 2d+1, are stated as runnable claims in squaretheory.py, whose verify() passes all five with the operating point at 2−27.