generative_pioneers · molnar_interruptions
Interruptions (Molnár)
Vera Molnár's 1968 'Interruptions' series: a regular grid of rectangle cells where each cell's four border edges are drawn independently, each with its own random probability of being omitted. The result is a Mondrian-like orthogonal scaffolding with the same 1% of disorder that Molnár always insisted on: ordered enough to read as structure, broken enough to read as breath. The 'machine imaginaire' (1959) becomes a Fortran program on a Sorbonne mainframe in 1968; the algorithmic kernel is exactly the per-edge Bernoulli trial that the artist's notes describe.
Original: https://dam.org/museum/artists_ui/artists/molnar-vera/
▶ Try the live demo (JS port) ▶ Run reference.py via Pyodide 10 formulas have instant JS ports. The Pyodide path runs the actual Python in your browser — first load is ~6 MB, then instant.
Math essence
For each cell (ci, ri) on a (cols × rows) grid we draw each of the four rectangle edges with probability (1 − gap_prob), with small per-vertex Gaussian-like jitter jitter·cell_size. The full grid is independent draws, so the expected number of partial rectangles is gap_prob·4·cols·rows.
Parameters
| Name | Type | Default | Range | Description |
|---|---|---|---|---|
dim | int | 512 | 200–1200 | Square canvas side length |
cols | int | 12 | 4–40 | Grid columns |
rows | int | 16 | 4–40 | Grid rows |
margin | float | 0.06 | 0–0.3 | Outer margin (fraction of dim) |
gap_prob | float | 0.45 | 0–0.95 | Per-edge omission probability (Molnár's '1% disorder' tunable) |
jitter | float | 0.12 | 0–1 | Vertex jitter (pixels) |
thickness | float | 1.4 | 0.5–3 | Ink thickness |
bg_color | tuple | 245,240,230 | null–null | Background RGB |
line_color | tuple | 10,10,14 | null–null | Ink RGB |
seed | int | null | 0–999999 | RNG seed |
Reference
First 60 lines of reference.py. Full source:
library_external/generative_pioneers/molnar_interruptions/reference.py
from __future__ import annotations
from typing import ClassVar
import imageio.v2 as imageio
import numpy as np
class MolnarInterruptions:
family: ClassVar[str] = "generative_pioneers"
sketch: ClassVar[str] = "molnar_interruptions"
def __init__(
self,
dim: int = 512,
cols: int = 12,
rows: int = 16,
margin: float = 0.06,
gap_prob: float = 0.45,
jitter: float = 0.12,
thickness: float = 1.4,
bg_color: tuple[int, int, int] = (245, 240, 230),
line_color: tuple[int, int, int] = (10, 10, 14),
seed: int | None = None,
) -> None:
self.dim = dim
self.cols = cols
self.rows = rows
self.margin = margin
self.gap_prob = gap_prob
self.jitter = jitter
self.thickness = thickness
self.bg_color = np.array(bg_color, dtype=np.uint8)
self.line_color = np.array(line_color, dtype=np.uint8)
self._seed = seed
self.rng = np.random.default_rng(seed)
self.canvas = np.full((dim, dim, 3), self.bg_color, dtype=np.uint8)
self.time = 0
self._dirty = True
def reset(self, seed: int | None = None) -> None:
if seed is not None:
self._seed = seed
self.rng = np.random.default_rng(self._seed)
self.canvas = np.full((self.dim, self.dim, 3), self.bg_color, dtype=np.uint8)
self.time = 0
self._dirty = True
def _stroke(
self,
x0: float,
y0: float,
x1: float,
y1: float,
color: np.ndarray,
) -> None:
d = float(np.hypot(x1 - x0, y1 - y0))
steps = max(2, int(d))
base = self.canvas.astype(np.float32)
c = color.astype(np.float32) Try running it locally
The reference implementation is self-contained Python with numpy. Install the package and run:
python library_external/generative_pioneers/molnar_interruptions/reference.py Need help? See Learn for the standard environment setup, or Playground for an in-browser sketchbook.
More from generative pioneers
Line Arrangements (Mohr)
generative_pioneers · mohr_line_arrangement
Manfred Mohr's 1969 plotter 'Line Arrangements': a fixed grid of columns and rows, each carrying a small set of nearly-parallel lines whose exact positions are random within the cell, overlaid with a layer of 45° diagonals whose length, position and orientation are independently random.
Paint by Numbers (Haeberli)
generative_pioneers · haeberli_painterly
Paul Haeberli's 1990 SIGGRAPH 'Paint by Numbers' — the founding paper of stroke-based rendering.
Plotter Trajectories (Hébert)
generative_pioneers · hebert_plotter_trajectory
Jean-Pierre Hébert's plotter-trajectory idiom — parametric Lissajous-like curves drawn over multiple passes, each pass slightly phase-shifted, each segment modulated by the local velocity of the pen so that slow regions lay down heavier pigment and fast regions trace a ghost line.
Walk-through-Raster (Nake)
generative_pioneers · nake_walk_sequence
Frieder Nake's 1966 'Walk-through-Raster' program (Algol 60 on a Telefunken TR4, plotted on a ZUSE Graphomat Z64): a repertoire of six signs — empty, vshort, vlong, hshort, hlong, dot — is sampled into a Markov chain whose transition probabilities vary with chain position so that 'vertical strokes are high at the chain's middle, empties dominate at the ends'.