Generational Hatching: Evolving Patterns Through Drift

2026-01-12

Generational Hatching

There's something compelling about patterns that almost repeat. The ceramic tiles on Felt's recent Daniël bungalow renovation in Ghent caught my attention - a blue-tiled tower that marks the entrance, where the regularity of the grid meets the handmade quality of ceramic. It reminded me of hatching marks in architectural drawings, particularly Nolli maps, where the density and rhythm of lines define space.

This sketch explores that territory: what happens when we take a regular hatching pattern and let it drift over time?

The Algorithm

The core idea is simple:

  1. Start with hatching - rows of short vertical marks drawn across the canvas
  2. Add noise to spacing - each mark's position is perturbed by Perlin noise, creating organic variation
  3. Introduce generational drift - each row inherits slight deformations from the row above
  4. Compound over time - small changes accumulate until the pattern transforms
Row 0: ||||||||||||||||||||||  (initial state)
Row 1: ||||||||||||||||||||||  (barely different)
Row 2: |||||||||||||||||||||/  (subtle rotation)
...
Row 50: ///////////////\\\\\    (accumulated drift)

The key is keeping the rate of change small - around 1% per generation. Any single row looks nearly identical to its neighbors, but over dozens of rows, the pattern evolves significantly.

Configuration Parameters

The sketch exposes several parameters:

Hatching

  • hatchLength - length of each mark
  • baseSpacing - horizontal gap between marks
  • rowHeight - vertical gap between generations

Noise variation

  • spacingNoiseScale - frequency of noise sampling
  • spacingVariation - maximum deviation from base spacing (as percentage)

Generational deformation

  • deformationRate - overall rate of change (~0.01 = 1%)
  • rotationDelta - rotation accumulated per row
  • scaleDelta - scale change per row
  • skewDelta - horizontal drift per row

Each regeneration randomizes the direction and magnitude of these deltas within the configured rate, producing different evolutionary trajectories.

Visual Output

The pattern creates fields that read as texture from a distance but reveal their structure up close. The noise-driven spacing prevents the mechanical regularity that would make the grid feel sterile, while the generational drift introduces a sense of time - each row is a moment in the pattern's evolution.

At low deformation rates, the piece feels meditative and stable. Increase the rate and the pattern becomes more dynamic, with visible waves and distortions emerging across the canvas.

Controls

s     = export SVG (plotter-ready)
p     = export PNG
j     = export JPEG
r     = regenerate with new seed
+/-   = adjust deformation rate
[/]   = adjust base spacing
SPACE = pause/unpause animation
1-5   = preset canvas sizes

Connections

The Nolli map reference feels apt here. Giambattista Nolli's 1748 map of Rome used solid black to show built mass and white for public space - the hatching distinguished private interiors. There's a similar quality in this sketch: the hatching defines a field, and its deformations suggest boundaries or zones within that field.

The generational metaphor also connects to cellular automata and growth patterns. Each row inherits from its predecessor, modified slightly. Like Conway's Game of Life or Wolfram's elementary automata, complex global patterns emerge from simple local rules.

Source

The Processing sketch lives in processing/generational_hatching/. The algorithm is deliberately simple - the richness comes from the interaction of noise and accumulation rather than complex rules.

← Back to Blog