Streamlines tracing a computed vector field, packed evenly across the canvas by spatial exclusion.
Build the field, then trace it
Unlike the other flow-field pieces here, this one builds an explicit vector grid
before drawing anything:
var perlin = GridMode == 0 ? new PerlinNoise(PerlinZoom, Seed) : null;
var jurgen = new (float x, float y, float amp)[JurgenPoints];
Two sources are combined. PerlinNoise supplies a smooth background direction; the
jurgen points are a scatter of vortices, each with a position and an amplitude, whose
influence falls off with distance.
The result is a field with large-scale swirl — which is what makes the piece look like
the sky in The Starry Night rather than like a noise field. Van Gogh’s swirls are
localised vortices on a broadly directional ground, and that is precisely the
decomposition here.
Two hundred strokes. The field they follow is already complete; every later stage adds
strokes rather than changing the field.
A sixth. Strokes run parallel where the field is smooth.
A third. The vortices are visible now — not as marks, but as the places where strokes
wind around a point instead of running past it.
Two thirds.
Even density, enforced
Each stroke starts from a random point, and a start is rejected if it lands too close to
a stroke already drawn. StopMargin sets that distance, converted from grid units:
float rMargin = StopMargin / vpGridRatio;
Without that rejection, four thousand random starts would clump — a uniform scatter has
holes and clusters at every scale — and the drawing would have bald patches.
Four thousand strokes.
Five fields
| Rendering | Grid mode | Ink |
|---|
| Cyan Starry Flow | Jurgen | cyan on black |
| Gold Perlin Flow | Perlin (fine) | gold on dark blue |
| Pink Spiral Flow | spiral | pink on near-black |
| Indigo Twist Flow | Jurgen (mixed) | indigo on deep purple |
| Ember Wave Flow | Perlin (coarse) | ember red on warm black |
GridMode chooses the field geometry. The Jurgen presets both use multi-vortex fields
but differ in polarity: Cyan Starry Flow’s vortices all rotate the same way, while Indigo
Twist Flow mixes clockwise and counterclockwise centres, producing S-curves and figure-8
patterns between neighbouring opposite-spin vortices.
The two Perlin presets differ in scale: Gold Perlin Flow samples the noise lattice at 1.5×
zoom, producing fine curling texture; Ember Wave Flow samples at 0.4×, which spans less
than one lattice cell and produces large rolling arcs instead.
Museum presentation
The Museum Presentation gallery item renders the Cyan Starry Flow artwork inside the
upstream MuseumFrame — wall, mat, frame, and drop shadow — at 1000×1000. The
generation is identical: same seed, same field, same strokes. The artwork knows nothing
about being framed; MuseumFrame draws it into the opening independently, so the same
pattern applies to any preset without touching the field logic.
Determinism
One Random is created per draw, seeded from the preset, and used for the vortex
positions and the stroke starts, in that order. The generator is System.Random, which
the project’s determinism policy flags as not guaranteed stable across .NET versions.