---
title: "Ink · generative art"
description: "Sumi on paper, in anger. Generative art plate #42 by Theodore Vorillas, drawn live in your browser from its code."
url: "https://vorillaz.com/lab/ink"
---

![](https://vorillaz.com/_astro/ink.BKHbmwDt_2rw5Dg.webp)

fig. #42 · rendered live in your browser from the code below

# #42 ink

Sumi on paper, in anger.

- date

  2026.10.13

- tags

  generative-art · javascript

The lab turned over: paper in the ink colour, ink in graphite. Each stroke is a brush of many bristles swung along one curve that starts beyond the paper and leaves past it, so only the body of the swing crosses the sheet. Every bristle carries its own load of ink and runs dry at its own pace, the outer ones first, and where the hand lifts mid-swing the stroke pales and thins before it presses down again. Ink flicks off in streaks and drops. Play it and the strokes keep coming, fast and close, each one laid down black over the last while the older ones sink into the paper.

## The bristles

```javascript title="ink.js"
// each hair has its place across the brush and its own load of ink
const bristles = range(120).map((i) => ({ o: i / 119 - 0.5, load: random(0.6, 1), edge: abs(i / 59.5 - 1) }));

// it runs dry at its own pace, the outer ones first; a lifted hand starves them all
const ink = (b, t) => b.load - t * dry * (0.4 + b.edge * 0.8) - (1 - hold(t)) * 0.55 + 0.42 * (noise(j * 0.31, t * 9) - 0.5);
if (ink(b, t) > 0.03) line(at(b, t - dt), at(b, t), { alpha: level(ink(b, t)) });
```

## The swing

```javascript title="ink.js"
// both ends beyond the paper: no stroke starts or stops in view
const [p0, p3] = [sub(centre, scale(dir, diagonal * 0.8)), add(centre, scale(dir, diagonal * 0.8))];

// where the hand lifts, the ink pales and the brush narrows a little; then it presses again
const hold = (t) => 0.12 + 0.88 * clamp((noise(key, t * 7.5) - 0.32) / 0.26);
const wet = (t) => 0.94 * max(0, 1 - t * dry * 0.8) ** 1.1 * hold(t);

// playing: each new stroke goes down black, after the paper is laid thinly over what came before
over(paper, 0.055);
bake(stroke);
```

## References

- [Sumi-e](https://en.wikipedia.org/wiki/Ink_wash_painting)
- Hairy brushes, Steve Strassmann, 1986
