Voronoi & Delaunay: One Point Set, Two Trades
How Voronoi cells and their Delaunay dual turn one seed field into both a panelisation and a framing logic — with a runnable d3-delaunay browser hack.
Scatter a handful of seed points on a plane and ask a single question of every other location: which seed is nearest? The answer carves the plane into cells, one per seed, each holding all the territory closer to its seed than to any rival. That is a Voronoi diagram, and it is the most useful partition in computational design because it answers the only question fabrication ever really asks — which piece owns which patch of surface.
The structure was sketched by Descartes in 1644, formalised in the plane by Dirichlet in 1850 (German-speaking maths still says Dirichlet-Zerlegung), and generalised to n dimensions by Georgy Voronoi in 1908. The move that matters to a designer came in 1934, when Voronoi’s student Boris Delaunay proved the dual: connect two seeds whenever their cells share an edge and you get a triangulation that maximises the minimum interior angle — it refuses slivers. As our own Kaffipedia Voronoi panel puts it, the cell is the panel, the triangulation is the mesh: one geometry, two trades.
←TODAY: A browser sketch with d3-delaunay turns a click into a buildable panel set before you open Rhino. →3012: The seed field outlives the file format — reconstruct the form from its principle, not its plugin. Fulcrum: The diagram is the same whether it clads the Water Cube or routes a cholera map; learn the partition once and it pays out across every trade that decides nearest-to-where.
Why the duality is the whole lesson. Most readers conflate the two diagrams; the engineering is in keeping them apart. Voronoi vertices are the circumcentres of the Delaunay triangles, so one structure is computed from the other for free — no second algorithm. That is why a single point cloud gives you both a panelisation logic (the Voronoi cells: cladding, acoustic diffusers, PV tiles) and a framing logic (the Delaunay mesh: a well-conditioned shell that won’t buckle on a slender member). Switch readings without moving a seed.
The canonical built proof is the Beijing National Aquatics Center — the Water Cube, PTW Architects with Arup and CSCEC, 2008 — whose ETFE envelope sits on the Weaire–Phelan foam, a three-dimensional cousin of the Voronoi tessellation discovered at Trinity College Dublin in 1993. Roughly 4,000 cushions, two cell types: a mathematical conjecture turned straight into structure. For PAZ readers the nearer lineage is ETH’s form-finding tradition — the Block Research Group’s funicular shells answer the same question Voronoi does, just with force paths instead of nearest-neighbour distance.
Atelier: On a real façade the random scatter looks cheap; the fix is Lloyd’s relaxation — iterate each seed toward its cell’s centroid until the cells equalise into a centroidal Voronoi tessellation. Weight that centroid by a scalar field (solar exposure, a stress map) and panels shrink exactly where the load or the sun is highest, with no manual zoning. That weighted CVT is the same maths underneath variable-density 3D-print infill.
Hack: This Hack teaches you to read the duality on one point set in the browser. The medium is JavaScript; the domain is Geometry. Drop d3-delaunay v6 into a sketch, build the triangulation once, and ask it for both readings — the Voronoi cells and the Delaunay triangles fall out of the same object.
import {Delaunay} from "d3-delaunay";
const pts = Array.from({length: 200}, () => [Math.random()*30, Math.random()*20]);
const d = Delaunay.from(pts); // Delaunay triangulation
const vor = d.voronoi([0, 0, 30, 20]); // Voronoi cells, clipped to plot
const panels = [...pts.keys()].map(i => vor.cellPolygon(i)); // each cell = one panel
console.log(panels.length, "panels", d.triangles.length/3, "struts");One Delaunay.from call; two trades out. Run it, jitter the seeds, watch a strut appear every time a panel edge does — that is the dual, live.
Move: Before your next free-form surface, prototype the seed field in the browser, name the scalar you weight it by, and write that objective down. If a tool generates the cells for you, make it tell you which energy it minimised — a form you cannot re-derive is one you cannot defend in a structural review.