Updated July 26th : Added a circle sampling method.
This appears to be tool-class weekend! Here’s another that I just finished up.
I’ve been wanting uniform poisson-disk distribution generation code for ages, ever since I started working with shadow map filtering in October 2006. I had difficulty decrypting the whitepapers that popped in the first results of Google at the time, so I just gave up for a little bit until… well… someone did a simple implementation for me to grab.
Thankfully, it happened!
The fine gentlemen at Luma labs (Herman Tulleken is credited for the class I converted) released a Java, Python and Ruby implementation of uniform and non-uniform poisson-disk sampling. It’s based on an oddly straightforward whitepaper by Robert Bridson at the UBC (in Canada!).
It took me under an hour to make it work in C#. This will prove very useful in my PCF filtering code, and I will be using it immediately in a Depth-of-Field shader I’m working on.
UniformPoissonDiskSampler.cs (4 kb – C# class)
This one uses Vector2′s from the SlimDX namespace, but it would be easy to just replace them with XNA Vector2′s or TV3D TV_2DVECTOR’s.
The original Java code used a non-static class, I decided to make it static and use structures for settings and state. This will reduce garbage if it’s used repeatedly, and since I send the structures as references, it’s just as fast as instance variables. I feel it’s a bit cleaner too.
The pointsPerIteration parameter defaulted to 30 in the original code, I did this too and it works well. You can reduce it to have potentially less dense distributions but much faster generation, or make it higher to make sure the whole space is filled.
Again, I won’t post a sample because the class usage is as simple as can be : it returns a List<Vector2> in the specified domain.