'use strict' var monotoneTriangulate = require('./lib/monotone') var makeIndex = require('./lib/triangulation') var delaunayFlip = require('./lib/delaunay') var filterTriangulation = require('./lib/filter') module.exports = cdt2d function canonicalizeEdge(e) { return [Math.min(e[0], e[1]), Math.max(e[0], e[1])] } function compareEdge(a, b) { return a[0]-b[0] || a[1]-b[1] } function canonicalizeEdges(edges) { return edges.map(canonicalizeEdge).sort(compareEdge) } function getDefault(options, property, dflt) { if(property in options) { return options[property] } return dflt } function cdt2d(points, edges, options) { if(!Array.isArray(edges)) { options = edges || {} edges = [] } else { options = options || {} edges = edges || [] } //Parse out options var delaunay = !!getDefault(options, 'delaunay', true) var interior = !!getDefault(options, 'interior', true) var exterior = !!getDefault(options, 'exterior', true) var infinity = !!getDefault(options, 'infinity', false) //Handle trivial case if((!interior && !exterior) || points.length === 0) { return [] } //Construct initial triangulation var cells = monotoneTriangulate(points, edges) //If delaunay refinement needed, then improve quality by edge flipping if(delaunay || interior !== exterior || infinity) { //Index all of the cells to support fast neighborhood queries var triangulation = makeIndex(points.length, canonicalizeEdges(edges)) for(var i=0; i