A brief introduction to Delaunay refinement
The Tinfour open-source software project recently introduced a Java-based implementation of Ruppert’s Delaunay refinement method. To assist developers who wish to use the Tinfour implementation, or any other implementation of Delaunay refinement, these notes provide a brief introduction to the concepts and applications of this technique.
The Delaunay triangulation is a technique for constructing an optimal triangular mesh from a set of unstructured (or “scattered”) points (see Lucas, 2017). It is often used for geophysical applications and in finite element analysis methods. One of the desirable qualities of the Delaunay is that it tends to produce “robust” triangles (i.e. it avoids constructing triangles with small angles). Unfortunately, there are many cases where the underlying geometry of the sample points or the presence of application-defined constraints results in the production of “skinny” triangles (i.e. flattened triangles with one or two very small angles). The presence of skinny triangles can lead to numeric issues in geometric calculations and may result in undesirable artifacts in graphics or physical modeling applications. Delaunay refinement techniques attempt to remedy this situation by introducing synthetic points (called “Steiner” points) at optimally selected locations to improve the quality of the Delaunay triangulation.
The figure below shows two views of Delaunay triangulations for Lake Michigan, one of the North American Great Lakes. The left panel shows the results of a constrained Delaunay triangulation constructed from a low-resolution digitized shoreline for the lake. The source data provides 616 points to describe about 1200 miles (1946 km) of shoreline. Because the shoreline represents a fixed, real-world object, the Delaunay triangulation is not allowed to modify the geometry of the edges that define the lake polygon. This constraint limits the ability of the Delaunay to optimize the triangles that it produces. So, even though the resulting mesh is “Delaunay conforming”, it is prone to the skinny triangles visible in the image.
To improve the overall quality of the mesh, the Delaunay refinement technique introduces Steiner points at optimally selected positions as shown in the panel to the right. In the figure, the vertices added in the open-water parts of the lake are Steiner points. In cases where a constrained edge is “encroached” by a vertex (i.e. the vertex lies too close to the edge), Ruppert’s technique implements logic to split the line at its midpoint. The split improves the quality of the local mesh by dividing the large obtuse angle of the adjacent triangle into smaller pieces. And because it occurs at the midpoint, this split operation does not alter the geometry of constrained line segment.
There are a number of Delaunay refinement techniques. Tinfour software project includes a Java-based implementation of Ruppert’s method (Ruppert, 1995). Some characteristics of Ruppert’s method include:
When a Steiner point is inserted into a Delaunay triangulation, it eliminates skinny triangles by deleting some edges and introducing others. But, by definition, constrained edges must be preserved and cannot be deleted. Thus constraints can prove challenging when two connected edges form an angle smaller than the minimum-angle specification for the refinement operation. For example, the Lake Michigan polygon has a number of small features representing the mouths of rivers, inlets, jetties, peninsulas, etc. These features commonly include pairs of connected line segments that form very small angles. Unfortunately, there are no satisfactory methods for applying Delaunay refinement in cases where these features need to be preserved. Ruppert and other authors have proposed techniques for minimizing their impact (for example, see the “Terminator” algorithm in Shewchuk, 2001). Most Delaunay refinement implementations include logic to handle problematic input sets.
When using the Tinfour implementation, it may be useful to keep the following practical considerations in mind.
Additional processing options are described in the class documentation.
These notes provide a very brief introduction to the ideas of Delaunay refinement. While they should be enough to get you started using Tinfour’s Java-based Delaunay refinement classes, there are many opportunities for further reading if you are interested. The topic of Delaunay refinement has been extensively studied and discussed in the published literature. In particular, we recommend looking at the work of Jonathan Shewchuk (for example, Shewchuk, 2001). Mr. Shewchuk is an accomplished writer whose work presents a rare combination of readability and a deep mathematical knowledge of the Delaunay triangulation and refinement algorithms.
The Tinfour free open-source software project is continuing work on its Java-based Delaunay refinement classes. We are currently looking into improved metrics and performance with special attention to scalability issues.
Delaunay, Boris (1934). "Sur la sphère vide", _Otdelenie Matematicheskikh i Estestvennykh Nauk 7_, p. 793–800
Lucas, G. (2017). An introduction to the Delaunay triangulation. Tinfour Software Project (Github). Accessed Nov. 2025 from https://gwlucastrig.github.io/TinfourDocs/DelaunayIntro/.
Ruppert, J. (1995). A Delaunay refinement algorithm for quality 2-dimensional mesh generation. Journal of Algorithms, Volume 18, Issue 3, pg. 548-585. Downloaded Nov. 2025 from https://www.cis.upenn.edu/~cis6100/ruppert.pdf.
Shewchuk, J. (2001). Delaunay refinement algorithms for triangular mesh generation. Department of Electical Engineering and Computer Science, University of California, Berkeley. Accessed Nov. 2025 from https://people.eecs.berkeley.edu/~jrs/papers/2dj.pdf.
U.S. National Ice Center (USNIC). (2025). Great Lakes data support files. File: GL20250515_lam.shp. Downloaded Oct. 2025 from https://usicecenter.gov/Products/GreatLakesData