Voronoi Stippling With Directed Density
Turn image tone into authored point density with weighted centroids, protected edges, deterministic relaxation, deliberate marks, and export evidence.
Voronoi stippling translates image tone into point density: dark regions attract more marks, light regions breathe, and the final picture appears through spacing rather than filled pixels. The craft is deciding where mathematical evenness should yield to an edge, gesture, or focal point.
This guide builds a seeded weighted relaxation loop, then adds art-direction controls for edge protection, dot scale, negative space, and physical output.
The supporting vocabulary is density-weighted cells, Lloyd relaxation, image stippling, tonal sample field. Each term serves the same search intent: turn an image tone map into authored stipple density without losing edges or reproducibility.
My position is that perfect centroidal regularity can make stippling feel sterile. A useful system converges enough to distribute tone while preserving selected irregularities that carry the image's character.
- Tone field
- Voronoi cells
- Weighted centroids
- Final dots
Voronoi stippling starts with a tone field
The density function is the composition: it decides where the eye finds mass, quiet, and transitions. The Secord weighted Voronoi stippling paper presents weighted centroidal Voronoi diagrams for stippling images. In this Voronoi stippling method, the important move is to make the hidden variable visible before optimizing the attractive output.
Use four concrete actions:
- Convert luminance consistently
- Choose dark- or light-attracting weight
- Protect alpha and masks
- Preview the scalar field
The useful measurement is weight distribution across tonal bands. Record the input, configuration, observation window, and rejected control together. That bundle makes the result debuggable: another reviewer can tell whether a change improved the system or merely moved cost into a quieter part of the experience.
The failure to provoke is a gamma mistake sends dots into highlights. A test that never produces that failure is too polite; it cannot show that the guardrail works. Design the smallest counterexample first, then scale the experiment only after the bad case is unmistakable.
My decision rule is the tone map must visually match the intended hierarchy. This is a proposed operating boundary, not a claim about an undisclosed client system. It gives Voronoi stippling a defensible stopping point while leaving room for a different workload, visual goal, or device constraint to choose another answer.
Seed points reproducibly
Seeded randomness lets art direction compare changes without the entire field jumping between runs. The d3-delaunay documentation documents browser-ready Delaunay and Voronoi geometry operations. In this Voronoi stippling method, the important move is to make the hidden variable visible before optimizing the attractive output.
Use four concrete actions:
- Store the numeric seed
- Sample from the density field
- Enforce a small initial separation
- Keep a uniform-seed control
The useful measurement is initial density error and nearest-neighbor spread. Record the input, configuration, observation window, and rejected control together. That bundle makes the result debuggable: another reviewer can tell whether a change improved the system or merely moved cost into a quieter part of the experience.
The failure to provoke is random clumps dominate later relaxation. A test that never produces that failure is too polite; it cannot show that the guardrail works. Design the smallest counterexample first, then scale the experiment only after the bad case is unmistakable.
My decision rule is the same seed and input must reproduce the same initial points. This is a proposed operating boundary, not a claim about an undisclosed client system. It gives Voronoi stippling a defensible stopping point while leaving room for a different workload, visual goal, or device constraint to choose another answer.
Compute weighted centroids
A geometric cell center ignores tone inside the cell; a weighted centroid pulls the point toward locally darker material. The SVG specification defines the accessible vector output used for the final point field. In this Voronoi stippling method, the important move is to make the hidden variable visible before optimizing the attractive output.
Use four concrete actions:
- Clip cells to the canvas
- Sample weight inside each cell
- Accumulate weighted position
- Handle zero-weight cells
The useful measurement is movement and local density error per iteration. Record the input, configuration, observation window, and rejected control together. That bundle makes the result debuggable: another reviewer can tell whether a change improved the system or merely moved cost into a quieter part of the experience.
The failure to provoke is empty or degenerate cells emit invalid coordinates. A test that never produces that failure is too polite; it cannot show that the guardrail works. Design the smallest counterexample first, then scale the experiment only after the bad case is unmistakable.
My decision rule is every iteration preserves finite in-bounds points. This is a proposed operating boundary, not a claim about an undisclosed client system. It gives Voronoi stippling a defensible stopping point while leaving room for a different workload, visual goal, or device constraint to choose another answer.
| Option | Observed signal | Verdict |
|---|---|---|
| Random dots | clumps and holes | reject |
| Full relaxation | smooth; edges melt | inspect |
| Directed relaxation | tone plus gesture | ship |
Choose when to stop relaxing
Too few iterations retain clumps while too many erase the lively irregularity that makes dots feel drawn. In this Voronoi stippling method, the important move is to make the hidden variable visible before optimizing the attractive output.
Use four concrete actions:
- Plot total movement
- Render an iteration ladder
- Inspect edge retention
- Keep one over-relaxed control
The useful measurement is movement decay beside perceptual character. Record the input, configuration, observation window, and rejected control together. That bundle makes the result debuggable: another reviewer can tell whether a change improved the system or merely moved cost into a quieter part of the experience.
The failure to provoke is convergence becomes the goal instead of the image. A test that never produces that failure is too polite; it cannot show that the guardrail works. Design the smallest counterexample first, then scale the experiment only after the bad case is unmistakable.
My decision rule is stop at the earliest stable tonal reading. This is a proposed operating boundary, not a claim about an undisclosed client system. It gives Voronoi stippling a defensible stopping point while leaving room for a different workload, visual goal, or device constraint to choose another answer.
Test the weighted center
A tiny one-dimensional density fixture proves that mass pulls a centroid toward the intended side. In this Voronoi stippling method, the important move is to make the hidden variable visible before optimizing the attractive output.
Use four concrete actions:
- Define two sample positions
- Assign unequal weights
- Compute the weighted mean
- Assert direction and bounds
The useful measurement is known centroid location. Record the input, configuration, observation window, and rejected control together. That bundle makes the result debuggable: another reviewer can tell whether a change improved the system or merely moved cost into a quieter part of the experience.
The failure to provoke is weights are inverted and points flee dark areas. A test that never produces that failure is too polite; it cannot show that the guardrail works. Design the smallest counterexample first, then scale the experiment only after the bad case is unmistakable.
My decision rule is the weighted mean must move toward greater declared density. This is a proposed operating boundary, not a claim about an undisclosed client system. It gives Voronoi stippling a defensible stopping point while leaving room for a different workload, visual goal, or device constraint to choose another answer.
Runnable artifact. Save this bounded check as voronoi-stippling-density.test.mjs and run node --test voronoi-stippling-density.test.mjs. Expected output: PASS: weighted centroid follows mass.
import assert from "node:assert/strict";
import test from "node:test";
const centroid=xs=>xs.reduce((s,p)=>s+p.x*p.w,0)/xs.reduce((s,p)=>s+p.w,0);
test("weighted center",()=>{assert.equal(centroid([{x:0,w:1},{x:10,w:3}]),7.5);console.log("PASS: weighted centroid follows mass");});
Protect important edges
Pure density can blur a silhouette or eye line because points move across perceptual boundaries. In this Voronoi stippling method, the important move is to make the hidden variable visible before optimizing the attractive output.
Use four concrete actions:
- Build an edge mask
- Limit cross-edge movement
- Add guided seeds
- Compare with unprotected output
The useful measurement is edge contrast and point displacement. Record the input, configuration, observation window, and rejected control together. That bundle makes the result debuggable: another reviewer can tell whether a change improved the system or merely moved cost into a quieter part of the experience.
The failure to provoke is the field preserves tone but loses identity. A test that never produces that failure is too polite; it cannot show that the guardrail works. Design the smallest counterexample first, then scale the experiment only after the bad case is unmistakable.
My decision rule is selected structural edges may constrain relaxation. This is a proposed operating boundary, not a claim about an undisclosed client system. It gives Voronoi stippling a defensible stopping point while leaving room for a different workload, visual goal, or device constraint to choose another answer.
- SeedSeed
Place deterministic starting points.
- WeightWeight
Read density from tone and masks.
- RelaxRelax
Move points toward weighted centroids.
- DrawDraw
Art-direct radii, edges, and output.
Art-direct the marks
Radius, opacity, shape, and minimum spacing decide whether the result feels like graphite, ink, print, or digital dust. In this Voronoi stippling method, the important move is to make the hidden variable visible before optimizing the attractive output.
Use four concrete actions:
- Tie radius to a narrow tone range
- Cap overlap
- Vary one mark property at a time
- Preview at final physical size
The useful measurement is tonal response and dot collisions. Record the input, configuration, observation window, and rejected control together. That bundle makes the result debuggable: another reviewer can tell whether a change improved the system or merely moved cost into a quieter part of the experience.
The failure to provoke is large marks merge into accidental blobs. A test that never produces that failure is too polite; it cannot show that the guardrail works. Design the smallest counterexample first, then scale the experiment only after the bad case is unmistakable.
My decision rule is marks must preserve readable negative space. This is a proposed operating boundary, not a claim about an undisclosed client system. It gives Voronoi stippling a defensible stopping point while leaving room for a different workload, visual goal, or device constraint to choose another answer.
Export the stipple recipe
The artwork should travel with seed, density transform, iteration count, edge masks, and output dimensions. In this Voronoi stippling method, the important move is to make the hidden variable visible before optimizing the attractive output.
Use four concrete actions:
- Save normalized point coordinates
- Save radii and palette
- Hash the source image
- Attach print dimensions
The useful measurement is byte-stable vector regeneration. Record the input, configuration, observation window, and rejected control together. That bundle makes the result debuggable: another reviewer can tell whether a change improved the system or merely moved cost into a quieter part of the experience.
The failure to provoke is only the final SVG survives and the edit disappears. A test that never produces that failure is too polite; it cannot show that the guardrail works. Design the smallest counterexample first, then scale the experiment only after the bad case is unmistakable.
My decision rule is the recipe must reproduce the point field independently. This is a proposed operating boundary, not a claim about an undisclosed client system. It gives Voronoi stippling a defensible stopping point while leaving room for a different workload, visual goal, or device constraint to choose another answer.
The useful version is bounded
Let density establish the picture, then decide where convergence should stop serving mathematics and start serving the image. Protected edges and deliberate negative space are part of the algorithm's art direction.
Save the seed and point recipe, not only the final poster. Reproducibility makes subtle visual edits comparable and turns a generative accident into a medium.
Continue with Poisson disk sampling, canvas dithering, Bézier plotter art, foundations color in OKLCH. Those field notes deepen adjacent implementation choices without turning this page into several articles at once.