---
title: "Rhegma · generative art"
description: "A name, torn along its faults. Generative art plate #32 by Theodore Vorillas, drawn live in your browser from its code."
url: "https://vorillaz.com/lab/rhegma"
---

![](https://vorillaz.com/_astro/rhegma.CB1gJZXY_Z1CywB6.webp)

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

word

# #32 rhegma

A name, torn along its faults.

- date

  2026.10.13

- tags

  generative-art · javascript

A word in block letters, cut from paper and laid over each other, then handed to a vector field. Left alone, a field pulls the letters apart in every direction at once. Here a few fault lines turn the field towards themselves, and the word tears along them without coming apart. It holds still until you click it. Then the field flows on to another moment, and the word re-forms there. Now and then one letter comes through readable, and that one is drawn in signal orange.

Show the field to see the vectors and the faults under the geometry. Type a word of your own, up to ten letters and digits, and it gets torn the same way. Clear it to bring the name back.

## The field

```javascript title="rhegma.js"
// a coarse grid of vectors; between nodes, the four nearest are interpolated
const sample = (x, y) => bilinear(nodes, (x - x0) / dx, (y - y0) / dy);

// each node has a turbulent direction of its own, turned towards the nearest fault
// more strongly the further it stands from it
for (const node of nodes) {
  const own = angle(noise(i, j, t) * 5 * PI);
  const { point, distance } = nearest(faults, node);
  const pull = 0.72 * smoothstep(0.1 * H, 1.1 * H, distance);
  node.v = normalize(mix(own, direction(node, point), pull)) * 0.78 * H;
}
```

## The tear

```javascript title="rhegma.js"
// every edge is resampled finely, so the field can bend it
for (const vertex of letter.frames.flat()) {
  const lifted = { x: vertex.x, y: vertex.y + wave(vertex.x) }; // the word follows its faults
  vertex.out = add(lifted, scale(sample(lifted), vertex.spike ?? 1));
}

// the letter that moved most like one piece, and kept its area, reads
score = spread(offsets) / H + (kept < 0.55 ? 1 : abs(1 - kept) * 0.4);
```

## References

- [BRU-3](https://github.com/BRUTALISM/BRU-3), the generative logo of BRUTALISM
- [Vector field](https://en.wikipedia.org/wiki/Vector_field)
