'use strict' var inCircle = require('robust-in-sphere')[4] var bsearch = require('binary-search-bounds') module.exports = delaunayRefine function testFlip(points, triangulation, stack, a, b, x) { var y = triangulation.opposite(a, b) //Test boundary edge if(y < 0) { return } //Swap edge if order flipped if(b < a) { var tmp = a a = b b = tmp tmp = x x = y y = tmp } //Test if edge is constrained if(triangulation.isConstraint(a, b)) { return } //Test if edge is delaunay if(inCircle(points[a], points[b], points[x], points[y]) < 0) { stack.push(a, b) } } //Assume edges are sorted lexicographically function delaunayRefine(points, triangulation) { var stack = [] var numPoints = points.length var stars = triangulation.stars for(var a=0; a 0) { var b = stack.pop() var a = stack.pop() //Find opposite pairs var x = -1, y = -1 var star = stars[a] for(var i=1; i= 0) { continue } //Flip the edge triangulation.flip(a, b) //Test flipping neighboring edges testFlip(points, triangulation, stack, x, a, y) testFlip(points, triangulation, stack, a, y, x) testFlip(points, triangulation, stack, y, b, x) testFlip(points, triangulation, stack, b, x, y) } }