{"version":3,"sources":["webpack:///./node_modules/delaunator/index.js"],"names":["EPSILON","Math","pow","EDGE_STACK","Uint32Array","Delaunator","points","getX","defaultGetX","getY","defaultGetY","n","length","coords","Float64Array","i","p","Error","this","maxTriangles","max","_triangles","_halfedges","Int32Array","_hashSize","ceil","sqrt","_hullPrev","_hullNext","_hullTri","_hullHash","fill","_ids","_dists","update","hullPrev","hullNext","hullTri","hullHash","minX","Infinity","minY","maxX","maxY","x","y","cx","cy","i0","i1","i2","minDist","d","dist","i0x","i0y","i1x","i1y","minRadius","r","circumradius","i2x","i2y","quicksort","hull","j","d0","id","subarray","triangles","halfedges","orient","center","circumcenter","_cx","_cy","_hullStart","hullSize","_hashKey","trianglesLen","_addTriangle","xp","yp","k","abs","start","key","q","e","t","_legalize","floor","pseudoAngle","a","ar","b","a0","b0","al","bl","p0","pr","pl","p1","illegal","inCircle","hbl","_link","br","c","dx","dy","ax","ay","bx","by","orientIfSure","px","py","rx","ry","qx","qy","l","sign","ex","ey","fx","fy","ap","bp","cp","cl","ids","dists","left","right","temp","tempDist","median","swap","arr","tmp"],"mappings":"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","file":"js/chunk-vendors~9ba44a67.bcc5a59f.js","sourcesContent":["\nconst EPSILON = Math.pow(2, -52);\nconst EDGE_STACK = new Uint32Array(512);\n\nexport default class Delaunator {\n\n static from(points, getX = defaultGetX, getY = defaultGetY) {\n const n = points.length;\n const coords = new Float64Array(n * 2);\n\n for (let i = 0; i < n; i++) {\n const p = points[i];\n coords[2 * i] = getX(p);\n coords[2 * i + 1] = getY(p);\n }\n\n return new Delaunator(coords);\n }\n\n constructor(coords) {\n const n = coords.length >> 1;\n if (n > 0 && typeof coords[0] !== 'number') throw new Error('Expected coords to contain numbers.');\n\n this.coords = coords;\n\n // arrays that will store the triangulation graph\n const maxTriangles = Math.max(2 * n - 5, 0);\n this._triangles = new Uint32Array(maxTriangles * 3);\n this._halfedges = new Int32Array(maxTriangles * 3);\n\n // temporary arrays for tracking the edges of the advancing convex hull\n this._hashSize = Math.ceil(Math.sqrt(n));\n this._hullPrev = new Uint32Array(n); // edge to prev edge\n this._hullNext = new Uint32Array(n); // edge to next edge\n this._hullTri = new Uint32Array(n); // edge to adjacent triangle\n this._hullHash = new Int32Array(this._hashSize).fill(-1); // angular edge hash\n\n // temporary arrays for sorting points\n this._ids = new Uint32Array(n);\n this._dists = new Float64Array(n);\n\n this.update();\n }\n\n update() {\n const {coords, _hullPrev: hullPrev, _hullNext: hullNext, _hullTri: hullTri, _hullHash: hullHash} = this;\n const n = coords.length >> 1;\n\n // populate an array of point indices; calculate input data bbox\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (let i = 0; i < n; i++) {\n const x = coords[2 * i];\n const y = coords[2 * i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n this._ids[i] = i;\n }\n const cx = (minX + maxX) / 2;\n const cy = (minY + maxY) / 2;\n\n let minDist = Infinity;\n let i0, i1, i2;\n\n // pick a seed point close to the center\n for (let i = 0; i < n; i++) {\n const d = dist(cx, cy, coords[2 * i], coords[2 * i + 1]);\n if (d < minDist) {\n i0 = i;\n minDist = d;\n }\n }\n const i0x = coords[2 * i0];\n const i0y = coords[2 * i0 + 1];\n\n minDist = Infinity;\n\n // find the point closest to the seed\n for (let i = 0; i < n; i++) {\n if (i === i0) continue;\n const d = dist(i0x, i0y, coords[2 * i], coords[2 * i + 1]);\n if (d < minDist && d > 0) {\n i1 = i;\n minDist = d;\n }\n }\n let i1x = coords[2 * i1];\n let i1y = coords[2 * i1 + 1];\n\n let minRadius = Infinity;\n\n // find the third point which forms the smallest circumcircle with the first two\n for (let i = 0; i < n; i++) {\n if (i === i0 || i === i1) continue;\n const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i], coords[2 * i + 1]);\n if (r < minRadius) {\n i2 = i;\n minRadius = r;\n }\n }\n let i2x = coords[2 * i2];\n let i2y = coords[2 * i2 + 1];\n\n if (minRadius === Infinity) {\n // order collinear points by dx (or dy if all x are identical)\n // and return the list as a hull\n for (let i = 0; i < n; i++) {\n this._dists[i] = (coords[2 * i] - coords[0]) || (coords[2 * i + 1] - coords[1]);\n }\n quicksort(this._ids, this._dists, 0, n - 1);\n const hull = new Uint32Array(n);\n let j = 0;\n for (let i = 0, d0 = -Infinity; i < n; i++) {\n const id = this._ids[i];\n if (this._dists[id] > d0) {\n hull[j++] = id;\n d0 = this._dists[id];\n }\n }\n this.hull = hull.subarray(0, j);\n this.triangles = new Uint32Array(0);\n this.halfedges = new Uint32Array(0);\n return;\n }\n\n // swap the order of the seed points for counter-clockwise orientation\n if (orient(i0x, i0y, i1x, i1y, i2x, i2y)) {\n const i = i1;\n const x = i1x;\n const y = i1y;\n i1 = i2;\n i1x = i2x;\n i1y = i2y;\n i2 = i;\n i2x = x;\n i2y = y;\n }\n\n const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y);\n this._cx = center.x;\n this._cy = center.y;\n\n for (let i = 0; i < n; i++) {\n this._dists[i] = dist(coords[2 * i], coords[2 * i + 1], center.x, center.y);\n }\n\n // sort the points by distance from the seed triangle circumcenter\n quicksort(this._ids, this._dists, 0, n - 1);\n\n // set up the seed triangle as the starting hull\n this._hullStart = i0;\n let hullSize = 3;\n\n hullNext[i0] = hullPrev[i2] = i1;\n hullNext[i1] = hullPrev[i0] = i2;\n hullNext[i2] = hullPrev[i1] = i0;\n\n hullTri[i0] = 0;\n hullTri[i1] = 1;\n hullTri[i2] = 2;\n\n hullHash.fill(-1);\n hullHash[this._hashKey(i0x, i0y)] = i0;\n hullHash[this._hashKey(i1x, i1y)] = i1;\n hullHash[this._hashKey(i2x, i2y)] = i2;\n\n this.trianglesLen = 0;\n this._addTriangle(i0, i1, i2, -1, -1, -1);\n\n for (let k = 0, xp, yp; k < this._ids.length; k++) {\n const i = this._ids[k];\n const x = coords[2 * i];\n const y = coords[2 * i + 1];\n\n // skip near-duplicate points\n if (k > 0 && Math.abs(x - xp) <= EPSILON && Math.abs(y - yp) <= EPSILON) continue;\n xp = x;\n yp = y;\n\n // skip seed triangle points\n if (i === i0 || i === i1 || i === i2) continue;\n\n // find a visible edge on the convex hull using edge hash\n let start = 0;\n for (let j = 0, key = this._hashKey(x, y); j < this._hashSize; j++) {\n start = hullHash[(key + j) % this._hashSize];\n if (start !== -1 && start !== hullNext[start]) break;\n }\n\n start = hullPrev[start];\n let e = start, q;\n while (q = hullNext[e], !orient(x, y, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1])) {\n e = q;\n if (e === start) {\n e = -1;\n break;\n }\n }\n if (e === -1) continue; // likely a near-duplicate point; skip it\n\n // add the first triangle from the point\n let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]);\n\n // recursively flip triangles from the point until they satisfy the Delaunay condition\n hullTri[i] = this._legalize(t + 2);\n hullTri[e] = t; // keep track of boundary triangles on the hull\n hullSize++;\n\n // walk forward through the hull, adding more triangles and flipping recursively\n let n = hullNext[e];\n while (q = hullNext[n], orient(x, y, coords[2 * n], coords[2 * n + 1], coords[2 * q], coords[2 * q + 1])) {\n t = this._addTriangle(n, i, q, hullTri[i], -1, hullTri[n]);\n hullTri[i] = this._legalize(t + 2);\n hullNext[n] = n; // mark as removed\n hullSize--;\n n = q;\n }\n\n // walk backward from the other side, adding more triangles and flipping\n if (e === start) {\n while (q = hullPrev[e], orient(x, y, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1])) {\n t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]);\n this._legalize(t + 2);\n hullTri[q] = t;\n hullNext[e] = e; // mark as removed\n hullSize--;\n e = q;\n }\n }\n\n // update the hull indices\n this._hullStart = hullPrev[i] = e;\n hullNext[e] = hullPrev[n] = i;\n hullNext[i] = n;\n\n // save the two new edges in the hash table\n hullHash[this._hashKey(x, y)] = i;\n hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e;\n }\n\n this.hull = new Uint32Array(hullSize);\n for (let i = 0, e = this._hullStart; i < hullSize; i++) {\n this.hull[i] = e;\n e = hullNext[e];\n }\n\n // trim typed triangle mesh arrays\n this.triangles = this._triangles.subarray(0, this.trianglesLen);\n this.halfedges = this._halfedges.subarray(0, this.trianglesLen);\n }\n\n _hashKey(x, y) {\n return Math.floor(pseudoAngle(x - this._cx, y - this._cy) * this._hashSize) % this._hashSize;\n }\n\n _legalize(a) {\n const {_triangles: triangles, _halfedges: halfedges, coords} = this;\n\n let i = 0;\n let ar = 0;\n\n // recursion eliminated with a fixed-size stack\n while (true) {\n const b = halfedges[a];\n\n /* if the pair of triangles doesn't satisfy the Delaunay condition\n * (p1 is inside the circumcircle of [p0, pl, pr]), flip them,\n * then do the same check/flip recursively for the new pair of triangles\n *\n * pl pl\n * /||\\ / \\\n * al/ || \\bl al/ \\a\n * / || \\ / \\\n * / a||b \\ flip /___ar___\\\n * p0\\ || /p1 => p0\\---bl---/p1\n * \\ || / \\ /\n * ar\\ || /br b\\ /br\n * \\||/ \\ /\n * pr pr\n */\n const a0 = a - a % 3;\n ar = a0 + (a + 2) % 3;\n\n if (b === -1) { // convex hull edge\n if (i === 0) break;\n a = EDGE_STACK[--i];\n continue;\n }\n\n const b0 = b - b % 3;\n const al = a0 + (a + 1) % 3;\n const bl = b0 + (b + 2) % 3;\n\n const p0 = triangles[ar];\n const pr = triangles[a];\n const pl = triangles[al];\n const p1 = triangles[bl];\n\n const illegal = inCircle(\n coords[2 * p0], coords[2 * p0 + 1],\n coords[2 * pr], coords[2 * pr + 1],\n coords[2 * pl], coords[2 * pl + 1],\n coords[2 * p1], coords[2 * p1 + 1]);\n\n if (illegal) {\n triangles[a] = p1;\n triangles[b] = p0;\n\n const hbl = halfedges[bl];\n\n // edge swapped on the other side of the hull (rare); fix the halfedge reference\n if (hbl === -1) {\n let e = this._hullStart;\n do {\n if (this._hullTri[e] === bl) {\n this._hullTri[e] = a;\n break;\n }\n e = this._hullPrev[e];\n } while (e !== this._hullStart);\n }\n this._link(a, hbl);\n this._link(b, halfedges[ar]);\n this._link(ar, bl);\n\n const br = b0 + (b + 1) % 3;\n\n // don't worry about hitting the cap: it can only happen on extremely degenerate input\n if (i < EDGE_STACK.length) {\n EDGE_STACK[i++] = br;\n }\n } else {\n if (i === 0) break;\n a = EDGE_STACK[--i];\n }\n }\n\n return ar;\n }\n\n _link(a, b) {\n this._halfedges[a] = b;\n if (b !== -1) this._halfedges[b] = a;\n }\n\n // add a new triangle given vertex indices and adjacent half-edge ids\n _addTriangle(i0, i1, i2, a, b, c) {\n const t = this.trianglesLen;\n\n this._triangles[t] = i0;\n this._triangles[t + 1] = i1;\n this._triangles[t + 2] = i2;\n\n this._link(t, a);\n this._link(t + 1, b);\n this._link(t + 2, c);\n\n this.trianglesLen += 3;\n\n return t;\n }\n}\n\n// monotonically increases with real angle, but doesn't need expensive trigonometry\nfunction pseudoAngle(dx, dy) {\n const p = dx / (Math.abs(dx) + Math.abs(dy));\n return (dy > 0 ? 3 - p : 1 + p) / 4; // [0..1]\n}\n\nfunction dist(ax, ay, bx, by) {\n const dx = ax - bx;\n const dy = ay - by;\n return dx * dx + dy * dy;\n}\n\n// return 2d orientation sign if we're confident in it through J. Shewchuk's error bound check\nfunction orientIfSure(px, py, rx, ry, qx, qy) {\n const l = (ry - py) * (qx - px);\n const r = (rx - px) * (qy - py);\n return Math.abs(l - r) >= 3.3306690738754716e-16 * Math.abs(l + r) ? l - r : 0;\n}\n\n// a more robust orientation test that's stable in a given triangle (to fix robustness issues)\nfunction orient(rx, ry, qx, qy, px, py) {\n const sign = orientIfSure(px, py, rx, ry, qx, qy) ||\n orientIfSure(rx, ry, qx, qy, px, py) ||\n orientIfSure(qx, qy, px, py, rx, ry);\n return sign < 0;\n}\n\nfunction inCircle(ax, ay, bx, by, cx, cy, px, py) {\n const dx = ax - px;\n const dy = ay - py;\n const ex = bx - px;\n const ey = by - py;\n const fx = cx - px;\n const fy = cy - py;\n\n const ap = dx * dx + dy * dy;\n const bp = ex * ex + ey * ey;\n const cp = fx * fx + fy * fy;\n\n return dx * (ey * cp - bp * fy) -\n dy * (ex * cp - bp * fx) +\n ap * (ex * fy - ey * fx) < 0;\n}\n\nfunction circumradius(ax, ay, bx, by, cx, cy) {\n const dx = bx - ax;\n const dy = by - ay;\n const ex = cx - ax;\n const ey = cy - ay;\n\n const bl = dx * dx + dy * dy;\n const cl = ex * ex + ey * ey;\n const d = 0.5 / (dx * ey - dy * ex);\n\n const x = (ey * bl - dy * cl) * d;\n const y = (dx * cl - ex * bl) * d;\n\n return x * x + y * y;\n}\n\nfunction circumcenter(ax, ay, bx, by, cx, cy) {\n const dx = bx - ax;\n const dy = by - ay;\n const ex = cx - ax;\n const ey = cy - ay;\n\n const bl = dx * dx + dy * dy;\n const cl = ex * ex + ey * ey;\n const d = 0.5 / (dx * ey - dy * ex);\n\n const x = ax + (ey * bl - dy * cl) * d;\n const y = ay + (dx * cl - ex * bl) * d;\n\n return {x, y};\n}\n\nfunction quicksort(ids, dists, left, right) {\n if (right - left <= 20) {\n for (let i = left + 1; i <= right; i++) {\n const temp = ids[i];\n const tempDist = dists[temp];\n let j = i - 1;\n while (j >= left && dists[ids[j]] > tempDist) ids[j + 1] = ids[j--];\n ids[j + 1] = temp;\n }\n } else {\n const median = (left + right) >> 1;\n let i = left + 1;\n let j = right;\n swap(ids, median, i);\n if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right);\n if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right);\n if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i);\n\n const temp = ids[i];\n const tempDist = dists[temp];\n while (true) {\n do i++; while (dists[ids[i]] < tempDist);\n do j--; while (dists[ids[j]] > tempDist);\n if (j < i) break;\n swap(ids, i, j);\n }\n ids[left + 1] = ids[j];\n ids[j] = temp;\n\n if (right - i + 1 >= j - left) {\n quicksort(ids, dists, i, right);\n quicksort(ids, dists, left, j - 1);\n } else {\n quicksort(ids, dists, left, j - 1);\n quicksort(ids, dists, i, right);\n }\n }\n}\n\nfunction swap(arr, i, j) {\n const tmp = arr[i];\n arr[i] = arr[j];\n arr[j] = tmp;\n}\n\nfunction defaultGetX(p) {\n return p[0];\n}\nfunction defaultGetY(p) {\n return p[1];\n}\n"],"sourceRoot":""}