The Surface Grower Algorithm

By Steven Clark

Introduction to Surface Grower:

The Surface Grower algorithm is based on work done by David Cohen-Steiner and Frank Da, and is described in their paper "A Greedy Delaunay-Based Surface Reconstruction Algorithm", which can be found here. The description of the Surface Grower algorithm assumes basic familiarity with three-dimensional Delaunay Triangulations; therefore, the next section will introduce them along with other basic computational geometry concepts. If you are already familiar with such ideas, please feel free to skip ahead.

Computational Geometry Primer:

We'll start in two-dimensions. The first observation to make is that three non-co-linear points determine a circumcircle:

In other words, for any three non-co-linear points, there is a unique circle which passes through all three points. Hopefully this property is fairly intuitive.



It's interesting to note how the size of the circumcircle is affected by the shape of the triangle formed by the three points:

The triangle on the left has both a larger area and a larger perimeter, and yet, it has a smaller circumcircle than the triangle on the right because it is closer to being equilateral.
We're defining rt to be the radius of the circumcircle of triangle t. This quantity will play an important role in the Surface Grower algorithm, as we will see later.



The concept of the circumcircle helps us define something called the Delaunay Triangulation. The Delaunay Triangulation of a set of points is the set of all triangles having those points as vertices whose circumcircles are empty:

In other words, if you look at the circles defined by the triangles, you can see that they contain no other sample point.



As a brief aside, the Delaunay Triangulation has a geometric dual called the Voronoi Diagram (shown on the right):

We say that these two are duals, because they are different representations of the same information. One can generate a Voronoi diagram from a Delaunay Triangulation by taking the perpedicular bisectors to each of the Delaunay edges. If two Voronoi cells share a boundary, then they will be connected by an edge in the Delaunay Triangulation. Also, the intersections of the red boundary lines on the Voronoi diagram are the centers of the circumcircles of the triangles. There are many interesting properties which arise from the interactions between Delaunay & Voronoi, but most of them are beyond the scope of this project.



Below is a reconstruction of the Grand Canyon, done using the Bowyer-Watson algorithm--implemented by Ben Anderson in Fall '04.

This technique ignores the z-values of the points and performs a simple 2-D delaunay triangulation to obtain the mesh. This algorithm is ideal for topographical data, but doesn't work for a surface which crosses back under itself.



Now we're bumping up to three dimensions. Just like three points define a circle, we find that four non-co-planar points define a sphere. A Delaunay Triangulation in 3D is the set of all tetrahedra having those points as vertices whose circumspheres are empty. This is an example of what a 3-dimensional Delaunay Triangulation might look like:



Here is a depiction of some of the terminology we are going to be using:

Each tetrahedron will be called a cell. A cell has 4 facets, 6 edges, and 4 vertices. We'll be using the terms facet and triangle somewhat interchangeably.



Surface Grower:

So now you know what a Delaunay Triangulation is. What does this have to do with shape reconstruction? Well, it turns out that a certain subset of the facets formed as a result of a Delaunay Triangulation forms a good approximation to the original surface. A 2D version of the algorithm (curve reconstruction) would hopefully identify the edges in red as the best approximation to the original (admittedly odd) shape:

Therefore, the task of the algorithm could be restated as, "Given a Delaunay Triangulation, identify the collection of facets which best approximates the original surface." Of course, this is easier said than done.



The basic idea behind this algorithm is that we start from a seed facet, and grow the surface outwards from there, adding the most likely facets first in such a way as to keep a continuous boundary. Because we are grabbing the most likely facets first, we say that this is a greedy algorithm.

We will first describe the technique for locating the seed facet, since if you try to start from an incorrect facet (ie one inside the object), you will encounter significant difficulty. Basically, we want to insure that the seed facet is a) actually on the surface, and b) in an area of good sampling density. We do this by finding the facet with the smallest circumcircle. In other words, we iterate through all facets produced by the Delaunay triangulation, and find the one with the smallest rt.


So now that we have the seed facet, we can start growing our surface out from there. At this point, our surface consists of one triangle and three edges. For any given edge on the boundary of the current surface, there are going to be many incident facets:

For each edge, we're going to have to determine which of those facets is going to be our candidate facet. One useful thing to look at is the dihedral angle between the facet you're looking at and the adjoining surface, i.e. the angle between normal vectors 1 and 2:

You expect this to be small when the sampling density is good. So the incident facet with the smallest dihedral angle becomes our candidate facet for that edge.

To choose which of the candidate facets to add first, we need a metric with which to compare candidates against each other. We rank them according to their plausibility grade. Two factors go into the plausibility grade, those being the radius of the facet's circumcircle, and the dihedral angle of the facet. The relationship is shown here:
[fix me]
The idea behind the 30 degree threshold is that for sufficiently small dihedrals, the dihedral becomes less of a meaningful metric (especially in the presence of noise), and so we switch over to using the radius to determine the plausibility of the facet.

There are four main data structures we keep track of: The Delaunay Triangulation, a vector of the triangles we have selected thus far, a linked list of Boundary Edges, and a priority queue of candidate facets, sorted by decreasing plausability. At all stages of the algorithm, we have to keep these four up to date and correct.

With the priority queue of candidate facets, we can repeatedly pop off the facet with the highest plausibility and attempt to stitch it to the rest of the surface. There are four types of stitching that are allowable, as you can see up here:


Analysis:

The primary strengths of Surface Grower are due to the simplicity of the input requirements; all you need is a list of x, y, z values for points on the surface of the object; this type of data is frequently obtained from a laser-range scanner. Another nice feature is that the input data doesn't have to be constrained to parallel planes: point clouds are ok. And finally, little to no post-processing is required.

The weaknesses of the algorithm are that it is reliant on the feasability of computing a 3D delaunay triangulation. This can be a very computationally expensive task; in our case, we used the open source library CGAL to accomplish this task. Generally, CGAL seemed to be reasonably snappy and robust.

You also are not guaranteed to get a watertight model. Depending on your application, this may or may not matter. And finally, some manual tweaking is required for non-continuous surfaces; essentially, you have to tell it what kind of sampling density to expect.

Results:

Input to the algorithm:



...and triangulated output: