All studies

Weighted Voronoi relaxation

Weighted stippling

Thousands of dots settle into an image. Darker regions attract more ink; weighted Voronoi cells keep the distribution even.

JavaScript · Canvas · Web Workers · Weighted Voronoi relaxation

View source on GitHub

Try it

Runs locally in your browser. Uploaded images stay on your device.

All processing stays in your browser. Image uploads are resized to a 384px preview.

Run the relaxation, then export the dots as a resolution-independent SVG.

Source image
Source image
Precomputed Weighted stippling example
Computed example · run to make your own

Ready when you are.

Worker processing · local inputs · downloadable output

How it works

Run the relaxation, then export the dots as a resolution-independent SVG.

  1. Sample an initial point distribution according to image darkness.
  2. Assign weighted image samples to their nearest point, forming Voronoi cells.
  3. Move each point toward its cell’s weighted centroid and repeat.

Read the original research
Adrian Secord · 2002

Computed examples

Outputs from the same implementation used in the playground.

Original fox portrait used by the algorithm
Fox portrait · generated input
An animal portrait reconstructed with thousands of individually positioned ink dots
Weighted relaxation · individually positioned ink dots

Source photographs were generated for these studies. The displayed results were computed by the algorithms; they are not generated illustrations of an expected result. Published previews are compressed for the web.

Implementation and limits

Raster-sampled weighted Lloyd relaxation with exact nearest-site queries. This is a bounded preview, not an analytic continuous Voronoi integration.

Interactive settings are bounded to keep the experiment practical in a browser. Higher detail can cost more processing time without guaranteeing a better result. The implementation and its tests are available in the source repository.

The relaxation integrates darkness on a sampled grid. The dots are real positions that can be exported as SVG; no image texture is hidden behind them.