15,389,427 members
Articles / Programming Languages / C#
Article
Posted 10 Aug 2005

417.4K views
51 bookmarked

# Fortune's Voronoi algorithm implemented in C#

Rate me:
A C# implementation of the Fortune algorithm to compute 2D Voronoi graphs.

NOTE: Code has moved to Google Code!

## Introduction

Given a set of two dimensional vectors (or data points), a Voronoi graph is a separation of those points into compartments where all points inside one compartment are closer to the contained data point than to any other data point. I won't give any demonstration here, but if you want to know more about Voronoi graphs, check out this.

The applications of Voronoi graphs are quite broad. Very useful for a lot of optimization problems (in most cases, the Delaunay Triangulation which can be easily derived from a Vononoi graph is used there), it ranges to computing topological maps from bitmaps.

[This is an article for freaks. After a rather painful experience writing the thing I hope it will benefit everyone who is looking for this algorithm in a civilized language (or simply does not want to use Fortune's original C implementation).]

In 1987, Steve Fortune described an algorithm to compute such a graph by using a sweep line in combination with a binary tree. A PowerPoint explanation of the algorithm (the one I used to implement it) can be found here. Note that I did not use the linked data structure to represent a graph - I think that is an unnecessary difficulty in the age of `ArrayList`s and `HashSet`s.

## The Implementation

Data points are represented by my own `Vector` class. It can do much more than needed here (but there was no reason to strip it before bringing it) but I won't explain it here. The most important fact is that although working with `double`s the Vector class automatically rounds values to 10 digits (or whatever is set in the `Vector.Precision` field). Yes, sadly, this is very important if you want to sort of compare `double`s.

A `VoronoiGraph` is a class that only contains a `HashSet` of vertices (as 2D vectors) and a `HashSet` of `VoronoiEdge`s - each with references to the left and right data point and (of course) the two vertices that bound the edge. If the edge is (partially or completely) unbounded, the vector `Fortune.VVUnknown` is used.

`BinaryPriorityQueue` is used for the sweep line event queue.

## Usage

The algorithm itself (`Fortune.ComputeVoronoiGraph(IEnumerable)`) takes any `IEnumerable` containing only two dimensional vectors. It will return a `VoronoiGraph`. The algorithm's complexity is O(n ld(n)) with a factor of about 10 microseconds on my machine (2GHz).

## Share

 Software Developer (Senior) Germany
I did my diploma in Dresden and Sydney where I dealt with algorithms, agents and other cool AI stuff. Now I moved to Frankfurt to work on my PhD dealing with software structures for artificial intelligence systems. If I can, I do things in C# and ASP.NET, but if I have to, my C++, Java and SQL are not that bad.
Long Live .NET.

 Re: New Version Dimasina24-May-06 17:08 Dimasina 24-May-06 17:08
 Re: New Version [modified] BenDi26-May-06 6:37 BenDi 26-May-06 6:37
 Re: New Version Dimasina31-May-06 17:39 Dimasina 31-May-06 17:39
 Re: New Version ddb30-Mar-08 9:31 ddb 30-Mar-08 9:31
 Re: New Version BenDi1-Apr-08 11:11 BenDi 1-Apr-08 11:11
 Re: New Version ddb3-Apr-08 7:04 ddb 3-Apr-08 7:04
 Re: New Version ddb3-Apr-08 10:56 ddb 3-Apr-08 10:56
 Re: New Version ddb13-Apr-08 10:23 ddb 13-Apr-08 10:23
 Hi Ben, any thoughts on the point set I provided? After re-reading my previous post, I see you might interpret it as insulting to you. If you felt offended, I apologise, as it was in no way intented to do so. I was just being very disappointed with the situation, and quoted Calvin (& Hobbes)'s "crap" stop word. I think your implementation is quite elegant on the contrary. After having tested some other point sets, I still cannot see the logic in the error, as sometimes half-open (half infinite) edges point wrongly, but as well some normal edges are determined badly by the algorithm. Any chance this has to do with the numerical stability? Thank for your thoughts!
 Re: New Version BenDi13-Apr-08 23:05 BenDi 13-Apr-08 23:05
 Re: New Version [modified] ddb14-Apr-08 11:07 ddb 14-Apr-08 11:07
 Re: New Version Salvatore Previti9-Jun-08 6:40 Salvatore Previti 9-Jun-08 6:40
 Re: New Version Member 33274142-Mar-08 4:43 Member 3327414 2-Mar-08 4:43
 Re: New Version BenDi7-Mar-08 3:49 BenDi 7-Mar-08 3:49
 Re: New Version Member 33274147-Mar-08 10:09 Member 3327414 7-Mar-08 10:09
 Re: New Version Member 332741410-Apr-08 17:46 Member 3327414 10-Apr-08 17:46
 A mistake Dimasina4-May-06 11:20 Dimasina 4-May-06 11:20
 Re: A mistake mharley5-May-06 5:58 mharley 5-May-06 5:58
 Re: A mistake Dimasina5-May-06 11:35 Dimasina 5-May-06 11:35
 Re: A mistake BenDi6-May-06 11:17 BenDi 6-May-06 11:17
 Fortune's Voronoi algorithm implemented in C# pc_kf13-Mar-06 10:43 pc_kf 13-Mar-06 10:43
 Re: Fortune's Voronoi algorithm implemented in C# BenDi13-Mar-06 21:29 BenDi 13-Mar-06 21:29
 Voronoi Cell's attributes Truong Pham Dang Khoa10-Mar-06 23:36 Truong Pham Dang Khoa 10-Mar-06 23:36
 Re: Voronoi Cell's attributes BenDi12-Mar-06 11:12 BenDi 12-Mar-06 11:12
 Wrong Diagram - What's the problem ? ramirob1-Feb-06 12:19 ramirob 1-Feb-06 12:19
 Re: Wrong Diagram - What's the problem ? BenDi1-Feb-06 22:09 BenDi 1-Feb-06 22:09
 Last Visit: 31-Dec-99 18:00     Last Update: 8-Aug-22 0:56 Refresh ᐊ Prev123456 Next ᐅ