Two hundred concentric arcs, each starting at a random angle and sweeping a random distance.
One arc per ring
for (int i = 0; i < rings; i++)
{
float radius = (Center + Spacing * i) * fit;
DrawCircleArc(canvas, paint, radius, startAngle, sweepAngle);
}
Two hundred concentric radii at a constant step, and on each of them exactly one arc.
The arc’s start angle is a fresh random draw:
float startAngle = (float)Math.Ceiling(rnd.NextDouble() * 360);
and it sweeps a fresh random extent from there. So each ring is a broken circle; where the
break falls and how long the arc runs are independent draws.
Forty rings.
Where the spirals come from
Eighty rings. Look at where the arcs end: those endpoints are two hundred independent
uniform draws, and yet the eye finds curves running through them.
That is the same phenomenon as constellations. Two hundred points scattered at random on
two hundred concentric circles will, by chance, contain many near-alignments across
consecutive rings — and the visual system is very willing to join three or four
near-collinear points into a curve. The spirals are real in the image and absent from the
data.
A hundred and twenty rings.
A hundred and sixty.
Two hundred rings, fitted to the canvas: the radii are scaled so the outermost ring is
tangent to the canvas edge, and the whole field is inscribed in it — every ring fully
on-canvas, nothing clipped by the frame.
Six renderings
The same generator carries a few deliberate knobs beyond ink and pitch, and each
rendering turns a different one.
| Rendering | Structure | Ink |
|---|
| Pulse Cyan | 200 rings, one arc each — uniform start, uniform sweep | cyan on black |
| Ripple Purple | 250 rings, sweeps drawn 300–360° — circles with narrow chiselled gaps | purple on near-black |
| Wave Coral | 150 rings, two arcs per ring, starts advancing 7.2° per ring — a spiral the algorithm does draw | coral on deep blue |
| Sundial Gold | 120 rings, every sweep fixed at 75° | bronze on paper |
| Constellation Silver | 60 rings at a wide pitch, thick strokes | silver on deep navy |
| Orbit Teal | 180 rings, two paired arcs each, the innermost 24 in a brighter accent | teal on near-black |
The ratio of spacing to stroke width decides whether the rings read as separate lines or
merge into a field, and each rendering has its own seed, so the break positions differ
entirely. Every rendering fits its ring field to the canvas the same way — the outermost
ring tangent to the edge — so the six are compositions of one frame, differing in
structure, ink, pitch and seed.
Presentation
The finished piece is presented on a museum plate: the lead preset matted and framed.
The framing is a presentation layer around the generator, not a variant of it — the
same plate treatment can wrap any piece, and the artwork it presents is the unframed
render’s own pixels.
Determinism
The generator is seeded from the preset and consumes its stream in a fixed order: per
ring, innermost first, one start-angle draw — uniform, or a jitter around the coherent
progression — and then one sweep draw. A fixed sweep consumes none. The generator is
System.Random, which the project’s determinism policy flags as not guaranteed stable
across .NET versions.