A grid of squares, each turned by the product of its two indices — and the product is the picture.
One multiplication per tile
float angle = AngleMultiplier * (i * j);
That is the entire generative content. A square at grid position (i, j) is turned by a
constant times the product of its indices.
A sixth of the tiles.
Why a product and not a sum
If the angle were i + j the rotation would be constant along each anti-diagonal, and
the picture would be a set of straight diagonal bands — legible, and dull.
A product is not linear. The rotation is constant along the curves i·j = k, which are
hyperbolas, so the picture has curved contours despite every element being on a
square grid and every operation being multiplication.
The first row and the first column barely turn at all, because one factor is zero or one.
The far corner turns fastest, at AngleMultiplier × 19 × 19 — about 72 radians at the
default, which is eleven and a half full turns.
A third. The near edges are still nearly aligned.
Half. The rotation grows quadratically across the diagonal.
Three quarters. The hyperbolic contours are visible now: bands where neighbouring tiles
happen to share a rotation modulo a quarter turn, and therefore look aligned.
The full grid: four hundred tiles, one multiplication each.
Because a square is symmetric under quarter turns, the visible angle is the rotation
modulo 90° — so the apparent pattern is (i·j × AngleMultiplier) mod π/2, and the
aliasing of that modulus against the grid is where the moiré comes from.
Five renderings
| Rendering | Grid | Tile | Multiplier | Max rotation | Ink |
|---|
| Twist Blue | 20×20 | 50 | 0.2 | ~72° | blue on black |
| Twist Pearl | 30×30 | 34 | 0.06 | ~50° | warm white on near-black |
| Twist Amber | 24×24 | 42 | 0.38 | ~201° | amber on near-black |
| Twist Glacier | 12×12 | 84 | 0.75 | ~91° | icy blue on near-black |
| Twist Crimson | 17×17 | 58 | 1.0 | ~256° | crimson on near-black |
AngleMultiplier is the parameter that decides everything: it sets how quickly the
rotation aliases against the square’s own symmetry, and small changes to it reorganise
the whole field.
Museum frame
Museum Blue presents Twist Blue as a finished gallery piece: the grid in an opening
behind its dark mat (#181818), inside a frame that hangs on a gallery wall with a drop
shadow. The presentation is the upstream MuseumFrame from SkiaSharp.Extensions; the
generative content is unchanged — the framing is applied after the tiles are drawn.
Because a square looks the same every 90°, the apparent rotation period is one
quarter-turn. Multipliers low enough that the far corner never reaches 90° produce a
single soft sweep (Pearl, Blue); higher multipliers alias back and create two or more
visible cycles of the moiré (Amber, Crimson). Glacier sits at the boundary — its
far corner reaches almost exactly 91°, completing one loop and just tipping over into
the next — which gives it a qualitatively different look from either regime.
Determinism
Nothing is seeded and nothing is random. Every tile’s rotation is a product of two
integers.