Skip to content
Sample of Interruptions (Molnár)

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.

Family
generative_pioneers
Source
generative pioneers
Evolution
static_arrangement
Render
ink_lines_on_paper
Complexity
low
Agents
0
Year
1968
Author
Vera Molnár

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

Sample of Line Arrangements (Mohr)

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.

View →
Sample of Paint by Numbers (Haeberli)

Paint by Numbers (Haeberli)

generative_pioneers · haeberli_painterly

Paul Haeberli's 1990 SIGGRAPH 'Paint by Numbers' — the founding paper of stroke-based rendering.

View →
Sample of Plotter Trajectories (Hébert)

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.

View →
Sample of Walk-through-Raster (Nake)

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'.

View →

See all generative_pioneers artworks →