Fun With Poisson Disk Sampling

In my last post, I showed how to implement Bridson’s algorithm for Poisson disk sampling, and you might find yourself wondering where it might be useful. Well, wonder no more! In this post, I show some examples of how it can be used to make interesting versions of this image below.

Click the images below to view a high-resolution version. WARNING: some of the images are quite large (over 65MB).


This is a very simple algorithm. Once all the points have been created, for each one, I simply mapped the size of the ellipse drawn to the grayscale value of the pixel in the image!

Oil On Canvas

Here, I used layers of points generated using Bridson’s algorithm. Starting with large radii and working backwards to a small one brings out the details in the image. Colors are assigned to the ellipses based on the average color of all pixels in the region. A final touch of a canvas-like grid makes it appear painterly.

Charcoal Sketches

Here I create circles colored with the grayscale color in the image at the point being drawn, and give it a radius proportional to the darkness value. So a point over a black region gets a large radius while that over a white area gets a small radius. The effect is quite stunning!

Voronoi Mosaics

Here, I just generate a Voronoi diagram based on the generated points. The tiles are colored with the average color in the image at that location, and the borders are slightly darkened to give it a mosaic-like look.

Layered Voronoi Abstracts

Here, I just generate a Voronoi image as in the previous one. However, I color the polygons at a 50% opacity and layer them ten times. Since the generated Voronoi diagrams are slightly different each time, they form this nice abstract look.

Cross Hatching

Here, I just ignore points whose grayness value is above some threshold (that is, they’re too light), and for the remaining ones, I generate some cross-hatched lines using some translate() and rotate() calls.


Here, I create a base layer that follows the colors of the image strictly, but only when using large radii. When I get to the smaller radii, I start increasing the color variance a lot, resulting in a nice Pointillistic image.


In this one, I successively reduce the radius for which points are generated. For each set of points at a given radius, I generated brushstrokes oriented based on the image gradient at that point. My gradient implementation was not particularly good, and resulted in interesting artefacts! A little variation in the color brings out the character even more!

These are barely scratching at the surface of what is possible! If you come up with some cool examples, do write to me and I’ll add them here!

In the meantime, you can subscribe to my list to stay informed on new posts! No spam, guaranteed.