13,765,141 members
alternative version

#### Stats

72K views
35 bookmarked
Posted 18 Nov 2008
Licenced CPOL

# Visualization of the 2D Voronoi Diagram and the Delaunay Triangulation

, 18 Nov 2008
An add-on for the Fortune's algorithm.

## Introduction

This example uses a good implementation of the Fortune's algorithm performed by BenDi (see here). The goal of this application is the visualization of the Voronoi diagram.

## Using the code

The solution for the visualization problem is very easy. We add two static methods on the `Fortune` class:

```/// <summary>
/// Visualization of 2D Voronoi map.
/// </summary>
/// <param name="weight">Weight of result image.</param>
/// <param name="height">Height of result image.</param>
/// <param name="Datapoints">Array of data points.</param>
/// <returns>Result bitmap.</returns>
public static Bitmap GetVoronoyMap(int weight, int height, IEnumerable Datapoints)
{
Bitmap bmp = new Bitmap(weight, height);
VoronoiGraph graph = Fortune.ComputeVoronoiGraph(Datapoints);
Graphics g = Graphics.FromImage(bmp);
foreach (object o in graph.Vertizes)
{
Vector v = (Vector)o;
g.DrawEllipse(Pens.Black, (int)v[0]-2, (int)v[1]-2, 4, 4);
}
foreach (object o in Datapoints)
{
Vector v = (Vector)o;
g.DrawEllipse(Pens.Red, (int)v[0]-1, (int)v[1]-1, 2, 2);
}
foreach (object o in graph.Edges)
{
VoronoiEdge edge = (VoronoiEdge)o;
try
{
g.DrawLine(Pens.Brown, (int)edge.VVertexA[0],
(int)edge.VVertexA[1], (int)edge.VVertexB[0],
(int)edge.VVertexB[1]);
}
catch { }
}
return bmp;
}

/// <summary>
/// Visualization of Delaunay Triangulation
/// </summary>
/// <param name="weight">Weight of result image.</param>
/// <param name="height">Height of result image.</param>
/// <param name="Datapoints">Result bitmap.</param>
/// <returns></returns>
public static Bitmap GetDelaunayTriangulation(int weight,
int height, IEnumerable Datapoints)
{
Bitmap bmp = new Bitmap(weight, height);
VoronoiGraph graph = Fortune.ComputeVoronoiGraph(Datapoints);
Graphics g = Graphics.FromImage(bmp);
foreach (object o in Datapoints)
{
Vector v = (Vector)o;
g.DrawEllipse(Pens.Red, (int)v[0] - 1, (int)v[1] - 1, 2, 2);
foreach (object obj in graph.Edges)
{
VoronoiEdge edge = (VoronoiEdge)obj;
if ((edge.LeftData[0] == v[0])&(edge.LeftData[1] == v[1]))
{
g.DrawLine(Pens.Black, (int)edge.LeftData[0], (int)edge.LeftData[1],
(int)edge.RightData[0], (int)edge.RightData[1]);
}
}
}
return bmp;
}```

And now, we have images with diagrams:

Figure 1.Delaunay triangulation.

Figure 2.Voronoi diagram.

## Points of interest

Voronoi diagram is a very useful thing. It has specially interesting applications on terrain generation. I would like to develop a simple terrain generation algorithm based on the Voronoi diagram in future.

## Share

 Software Developer Russian Federation
No Biography provided

## You may also be interested in...

 First Prev Next
 Don't use this code! PehGuevara7-Mar-13 7:52 PehGuevara 7-Mar-13 7:52
 Why when I draw 2 points I don't see a line seb.4931-May-12 0:49 seb.49 31-May-12 0:49
 This algorithm fails when presented with a large number of points with obtuse angles Tomcat_101010101014-Sep-10 17:05 Tomcat_1010101010 14-Sep-10 17:05
 Rays ProphetLOD26-Jun-09 12:01 ProphetLOD 26-Jun-09 12:01
 Re: Rays Maxim_Barsuk28-Jun-09 20:13 Maxim_Barsuk 28-Jun-09 20:13
 Re: Rays ProphetLOD3-Jul-09 6:35 ProphetLOD 3-Jul-09 6:35
 Interesting vision FDemers11-May-09 23:13 FDemers 11-May-09 23:13
 Re: Interesting vision Maxim_Barsuk12-May-09 0:34 Maxim_Barsuk 12-May-09 0:34
 Re: Interesting vision FDemers12-May-09 0:52 FDemers 12-May-09 0:52
 Re: Interesting vision Maxim_Barsuk12-May-09 2:19 Maxim_Barsuk 12-May-09 2:19
 Re: Interesting vision FDemers12-May-09 2:28 FDemers 12-May-09 2:28
 WPF? dethtroll20-Nov-08 5:45 dethtroll 20-Nov-08 5:45
 Re: WPF? Maxim_Barsuk20-Nov-08 7:20 Maxim_Barsuk 20-Nov-08 7:20
 Delaunay Günther M. FOIDL19-Nov-08 5:32 Günther M. FOIDL 19-Nov-08 5:32
 Re: Delaunay Maxim_Barsuk19-Nov-08 20:08 Maxim_Barsuk 19-Nov-08 20:08
 Last Visit: 14-Nov-18 18:13     Last Update: 14-Nov-18 18:13 Refresh 1