A right-angle spiral where every segment is longer than the last, drawn with a pen wide enough to close the gaps.
Turn ninety, grow a little
Vector2 start = SegmentStart(i);
Vector2 end = start + SegmentDirection(i) * SegmentLength(i);
canvas.DrawLine(start.X, start.Y, end.X, end.Y, paint);
Every segment is a start point, a direction, and a length — each computed straight from
the step count, with no carried state. The direction cycles through the four axis
vectors: a right angle per step, four steps to a full turn. The length starts at
InitialSide and grows by SideIncrement every step, forever.
That is the whole construction. A square spiral, and the only two numbers that matter
are where the length starts and how fast it grows.
Ten steps: two and a half windings. At this size the segments are barely longer than
the pen is wide.
The pitch is constant
Because the length grows by a fixed amount per step and there are four steps to a
turn, the spiral’s radial pitch is 4 × SideIncrement / 2 per winding — a constant.
The windings are therefore evenly spaced from the centre to the edge, which is what
makes it read as a machined groove rather than as a widening coil.
For this rendering the arithmetic is:
steps per turn = 4
length gained per turn = 4 × 8 = 32
half of that, radially = 16 px
against a five-pixel stroke — so there is an eleven-pixel gap between windings, and the
spiral reads as separate lines rather than as a solid.
A quarter of the walk.
Half. Every winding is four segments and they are visibly of four different lengths —
the two long sides of one winding and the two of the next differ by 16 and 24 units
respectively, which is why the spiral is square but not concentric.
Three quarters.
The colour jitter
Each segment takes its own colour, drawn as the foreground shifted by up to ±40 in red
and blue and ±60 in green:
byte g = (byte)Math.Clamp(fg + rng.NextInt(-60, 60), 0, 255);
The wider range on green is the aesthetic choice behind the original renderings:
the walk drifts across the blue-to-green part of the spectrum rather than merely
lightening and darkening. It has no effect on geometry.
Both the ranges and the seed are properties now, JitterRed/JitterGreen/JitterBlue
and Seed, defaulting to 40, 60, 40 and 42. The three original renderings keep the
defaults, so they share one jitter sequence applied to different base colours; the
newer renderings each walk their own sequence.
A hundred steps: twenty-five square windings, final side length 800 units, reaching the
edge of the 800-pixel frame. Nothing checks the bounds — the fit is a consequence of
the three constants, and one of the three renderings overruns it.
Three renderings of the same walk
| Rendering | Steps | Initial side | Increment | Stroke | Pitch | Gap |
|---|
| Electric Teal | 100 | 8 | 8 | 5px | 16px | 11px |
| Aurora Green | 120 | 6 | 7 | 4px | 14px | 10px |
| Ice Blue | 80 | 10 | 10 | 6px | 20px | 14px |
All three leave a gap much wider than the pen, so all three read as coils rather than
as discs. What differs is the count: Aurora Green’s 120 steps at a 7-unit increment
reach a final side of 840 on an 800-pixel canvas, so it is the only one of the three
whose last winding runs off the frame.
Four treatments
The four newer renderings keep the walk and change the drawing around it. Their
geometry arithmetic is the same as the table above; what differs is how the lines
land, and what they wear.
Interlock draws the walk’s point-reflected twin, step interleaved with the walk,
so two spirals weave over and under one another: cyan over an ink-indigo ground, the
twin in amber. The twin gets its own rng seeded identically to the walk’s, so its
jitter sequence echoes the walk’s step for step. One number matters beyond the
constants: the initial side (6) and the increment (8) must be chosen so the twin’s
edges never land on the walk’s. They do when the initial side equals the increment —
every horizontal edge coincides, and the amber simply overpaints the cyan — and they
do again when it is twice the increment, which coincides the vertical edges. A
6-and-8 pair is neither, so every edge of the twin falls between two edges of the
walk and the weave reads in both directions.
Drift replaces the constant base colour with a walk from mint to cobalt: the base
itself is interpolated from Foreground to DriftTo, one step at a time, and the
jitter only roughens the arc. The innermost windings are mint, the outermost cobalt,
and every winding between is one step further along the arc.
Paper inverts the ground instead of the figure: warm paper with ink-dark
blue-green lines and round caps, and a jitter wide enough to read as a hand-drawn
texture rather than a print.
Diamond rotates the whole walk 45° around its centre and drops that centre a
little below the middle of the frame, so the square spiral sits on its corner as an
off-centre diamond in soft violet.
Museum Presentation places Electric Teal within a warm archival mat, a narrow
wood-toned reveal, and a charcoal frame. It is one presentation mode around the lead
design—not a second framed family of every colour variant—and leaves the spiral generator
unchanged.
Determinism
SeededRandom — the project’s stable Xoshiro256StarStar — is seeded from the
preset’s Seed property and consumed three times per segment, in step order. The
geometry consumes nothing. The mirrored twin gets a second rng seeded identically to
the walk’s, so its jitter sequence is the walk’s over again; drift and rotation are
plain arithmetic, a linear interpolation and a fixed rotation matrix. All eight
outputs—including the presentation layer—are byte-identical run to run.