The math, plainly
Every painting starts as a field of arrows: at each point of the canvas, a direction. The arrows come from two sources added together. Vortices β a few points the sky turns around, spinning hardest at a core radius and fading smoothly beyond it. And turbulence β a lattice of random values smoothed between grid corners, stacked at several zoom levels so small eddies ride on big ones. That sum is the whole physics β each brush just shapes the vortex falloff its own way. There is no simulation, just geometry.
v(p) β Ξ£α΅’ sα΅’ Β· (βΞyα΅’, Ξxα΅’) Β· rβα΅’ / (rΒ² + rβα΅’Β²) + c Β· curl N(p) Night, r = |p β cα΅’|
N(p) = Ξ£β aα΅ Β· n(Ξ»α΅ p), a β Β½, Ξ» β 2 n = lattice noise, corners blended by tΒ²(3 β 2t)
Strokes are not scattered at random; pure scatter reads as static, not brushwork. A new stroke may only begin a set distance from the ones already painted β one brush lays its candidates on an evenly-spread sequence, another spawns each stroke beside the last β and a coarse grid of already-painted cells enforces the spacing. Each start point is then traced along the arrows, so neighbors run parallel and comb around the eddies the way brush hair lies.
pβ = ( {Β½ + nΒ·0.754877β¦}, {Β½ + nΒ·0.569840β¦} ) R2 low-discrepancy sequence
grow while dist(other strokes) > 0.52Β·d_sep spawn neighbors at Β±1.05Β·d_sep
A stroke is not a line but one filled shape: a belly that tapers to a point at both ends, laid at 55β96% opacity. Many carry a thin lighter ridge along their lit side β paint catching light. That, not blur, is what makes flat pixels read as raised paint.
w(t) = w_max Β· (0.30 + 0.70Β·sin(Οt)^0.70), Ξ± = 0.60 + 0.32Β·ΞΎ Night
w(t) = w_max Β· (0.22 + 0.78Β·sin(Οt)^0.62), ridge + underside Impasto
The three brushes are three answers to where the strokes should go. Night currents composes a picture first: a moon, sometimes a second star, halo rings, a combed dark ground. Impasto cares about the paint itself: fatter ribbons with bristle streaks, an underside shadow, seams of canvas left showing. Cypress lets the line loose: long licks that overshoot around the vortices, and dark flame-shapes climbing the sky.
And none of it is random at the moment you look. A seed β one number, 0 to 9,999 β feeds a small generator (mulberry32) that deals out every "random" decision in a fixed order, like a shuffled deck dealt the same way twice. Same seed, same screen, same brush, same sliders: the same painting, stroke for stroke. Ten thousand seeds, three brushes, three palettes β ninety thousand paintings in this one file, before you touch a slider.
mulberry32: s β s + 0x6D2B79F5 (mod 2Β³Β²) β xor-shift mix β uniform [0, 1)
painting = F(seed, brush, palette, sliders, W, H) bit-for-bit reproducible
The constants above are lifted straight from the source. The rest is one View Source away.