yjryu / UI_Layout star
File name
Commit message
Commit date
yjryu 2024-01-10 b1cdf23 240110 류윤주 commit UNIX

Delaunator Build Status #

An incredibly fast JavaScript library for
Delaunay triangulation of 2D points.

Delaunay triangulation example

Projects based on Delaunator#

  • d3-delaunay for Voronoi diagrams, search, traversal and rendering (a part of D3).
  • d3-geo-voronoi for Delaunay triangulations and Voronoi diagrams on a sphere (e.g. for geographic locations).

Ports to other languages#

Example#

const points = [[168, 180], [168, 178], [168, 179], [168, 181], [168, 183], ...];

const delaunay = Delaunator.from(points);
console.log(delaunay.triangles);
// [623, 636, 619,  636, 444, 619, ...]

Install#

Install with NPM (npm install delaunator) or Yarn (yarn add delaunator), then:

// import as an ES module
import Delaunator from 'delaunator';

// or require in Node / Browserify
const Delaunator = require('delaunator');

Or use a browser build directly:

<script src="https://unpkg.com/[email protected]/delaunator.min.js"></script> <!-- minified build -->
<script src="https://unpkg.com/[email protected]/delaunator.js"></script> <!-- dev build -->

API Reference#

Delaunator.from(points[, getX, getY])#

Constructs a delaunay triangulation object given an array of points ([x, y] by default).
getX and getY are optional functions of the form (point) => value for custom point formats.
Duplicate points are skipped.

new Delaunator(coords)#

Constructs a delaunay triangulation object given an array of point coordinates of the form:
[x0, y0, x1, y1, ...] (use a typed array for best performance).

delaunay.triangles#

A Uint32Array array of triangle vertex indices (each group of three numbers forms a triangle).
All triangles are directed counterclockwise.

To get the coordinates of all triangles, use:

for (let i = 0; i < triangles.length; i += 3) {
    coordinates.push([
        points[triangles[i]],
        points[triangles[i + 1]],
        points[triangles[i + 2]]
    ]);
}

delaunay.halfedges#

A Int32Array array of triangle half-edge indices that allows you to traverse the triangulation.
i-th half-edge in the array corresponds to vertex triangles[i] the half-edge is coming from.
halfedges[i] is the index of a twin half-edge in an adjacent triangle
(or -1 for outer half-edges on the convex hull).

The flat array-based data structures might be counterintuitive,
but they're one of the key reasons this library is fast.

delaunay.hull#

A Uint32Array array of indices that reference points on the convex hull of the input data, counter-clockwise.

delaunay.coords#

An array of input coordinates in the form [x0, y0, x1, y1, ....],
of the type provided in the constructor (or Float64Array if you used Delaunator.from).

delaunay.update()#

Updates the triangulation if you modified delaunay.coords values in place, avoiding expensive memory allocations.
Useful for iterative relaxation algorithms such as Lloyd's.

Performance#

Benchmark results against other Delaunay JS libraries
(npm run bench on Macbook Pro Retina 15" 2017, Node v10.10.0):

 uniform 100kgauss 100kgrid 100kdegen 100kuniform 1 milliongauss 1 milliongrid 1 milliondegen 1 million
delaunator82ms61ms66ms25ms1.07s950ms830ms278ms
faster‑delaunay473ms411ms272ms68ms4.27s4.62s4.3s810ms
incremental‑delaunay547ms505ms172ms528ms5.9s6.08s2.11s6.09s
d3‑voronoi972ms909ms358ms720ms15.04s13.86s5.55s11.13s
delaunay‑fast3.8s4s12.57stimeout132s138s399stimeout
delaunay4.85s5.73s15.05stimeout156s178s326stimeout
delaunay‑triangulate2.24s2.04sOOM1.51sOOMOOMOOMOOM
cdt2d45s51s118s17stimeouttimeouttimeouttimeout

Papers#

The algorithm is based on ideas from the following papers: