d3-voronoi.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999
  1. // https://d3js.org/d3-voronoi/ Version 1.1.2. Copyright 2017 Mike Bostock.
  2. (function (global, factory) {
  3. typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
  4. typeof define === 'function' && define.amd ? define(['exports'], factory) :
  5. (factory((global.d3 = global.d3 || {})));
  6. }(this, (function (exports) { 'use strict';
  7. var constant = function(x) {
  8. return function() {
  9. return x;
  10. };
  11. };
  12. function x(d) {
  13. return d[0];
  14. }
  15. function y(d) {
  16. return d[1];
  17. }
  18. function RedBlackTree() {
  19. this._ = null; // root node
  20. }
  21. function RedBlackNode(node) {
  22. node.U = // parent node
  23. node.C = // color - true for red, false for black
  24. node.L = // left node
  25. node.R = // right node
  26. node.P = // previous node
  27. node.N = null; // next node
  28. }
  29. RedBlackTree.prototype = {
  30. constructor: RedBlackTree,
  31. insert: function(after, node) {
  32. var parent, grandpa, uncle;
  33. if (after) {
  34. node.P = after;
  35. node.N = after.N;
  36. if (after.N) after.N.P = node;
  37. after.N = node;
  38. if (after.R) {
  39. after = after.R;
  40. while (after.L) after = after.L;
  41. after.L = node;
  42. } else {
  43. after.R = node;
  44. }
  45. parent = after;
  46. } else if (this._) {
  47. after = RedBlackFirst(this._);
  48. node.P = null;
  49. node.N = after;
  50. after.P = after.L = node;
  51. parent = after;
  52. } else {
  53. node.P = node.N = null;
  54. this._ = node;
  55. parent = null;
  56. }
  57. node.L = node.R = null;
  58. node.U = parent;
  59. node.C = true;
  60. after = node;
  61. while (parent && parent.C) {
  62. grandpa = parent.U;
  63. if (parent === grandpa.L) {
  64. uncle = grandpa.R;
  65. if (uncle && uncle.C) {
  66. parent.C = uncle.C = false;
  67. grandpa.C = true;
  68. after = grandpa;
  69. } else {
  70. if (after === parent.R) {
  71. RedBlackRotateLeft(this, parent);
  72. after = parent;
  73. parent = after.U;
  74. }
  75. parent.C = false;
  76. grandpa.C = true;
  77. RedBlackRotateRight(this, grandpa);
  78. }
  79. } else {
  80. uncle = grandpa.L;
  81. if (uncle && uncle.C) {
  82. parent.C = uncle.C = false;
  83. grandpa.C = true;
  84. after = grandpa;
  85. } else {
  86. if (after === parent.L) {
  87. RedBlackRotateRight(this, parent);
  88. after = parent;
  89. parent = after.U;
  90. }
  91. parent.C = false;
  92. grandpa.C = true;
  93. RedBlackRotateLeft(this, grandpa);
  94. }
  95. }
  96. parent = after.U;
  97. }
  98. this._.C = false;
  99. },
  100. remove: function(node) {
  101. if (node.N) node.N.P = node.P;
  102. if (node.P) node.P.N = node.N;
  103. node.N = node.P = null;
  104. var parent = node.U,
  105. sibling,
  106. left = node.L,
  107. right = node.R,
  108. next,
  109. red;
  110. if (!left) next = right;
  111. else if (!right) next = left;
  112. else next = RedBlackFirst(right);
  113. if (parent) {
  114. if (parent.L === node) parent.L = next;
  115. else parent.R = next;
  116. } else {
  117. this._ = next;
  118. }
  119. if (left && right) {
  120. red = next.C;
  121. next.C = node.C;
  122. next.L = left;
  123. left.U = next;
  124. if (next !== right) {
  125. parent = next.U;
  126. next.U = node.U;
  127. node = next.R;
  128. parent.L = node;
  129. next.R = right;
  130. right.U = next;
  131. } else {
  132. next.U = parent;
  133. parent = next;
  134. node = next.R;
  135. }
  136. } else {
  137. red = node.C;
  138. node = next;
  139. }
  140. if (node) node.U = parent;
  141. if (red) return;
  142. if (node && node.C) { node.C = false; return; }
  143. do {
  144. if (node === this._) break;
  145. if (node === parent.L) {
  146. sibling = parent.R;
  147. if (sibling.C) {
  148. sibling.C = false;
  149. parent.C = true;
  150. RedBlackRotateLeft(this, parent);
  151. sibling = parent.R;
  152. }
  153. if ((sibling.L && sibling.L.C)
  154. || (sibling.R && sibling.R.C)) {
  155. if (!sibling.R || !sibling.R.C) {
  156. sibling.L.C = false;
  157. sibling.C = true;
  158. RedBlackRotateRight(this, sibling);
  159. sibling = parent.R;
  160. }
  161. sibling.C = parent.C;
  162. parent.C = sibling.R.C = false;
  163. RedBlackRotateLeft(this, parent);
  164. node = this._;
  165. break;
  166. }
  167. } else {
  168. sibling = parent.L;
  169. if (sibling.C) {
  170. sibling.C = false;
  171. parent.C = true;
  172. RedBlackRotateRight(this, parent);
  173. sibling = parent.L;
  174. }
  175. if ((sibling.L && sibling.L.C)
  176. || (sibling.R && sibling.R.C)) {
  177. if (!sibling.L || !sibling.L.C) {
  178. sibling.R.C = false;
  179. sibling.C = true;
  180. RedBlackRotateLeft(this, sibling);
  181. sibling = parent.L;
  182. }
  183. sibling.C = parent.C;
  184. parent.C = sibling.L.C = false;
  185. RedBlackRotateRight(this, parent);
  186. node = this._;
  187. break;
  188. }
  189. }
  190. sibling.C = true;
  191. node = parent;
  192. parent = parent.U;
  193. } while (!node.C);
  194. if (node) node.C = false;
  195. }
  196. };
  197. function RedBlackRotateLeft(tree, node) {
  198. var p = node,
  199. q = node.R,
  200. parent = p.U;
  201. if (parent) {
  202. if (parent.L === p) parent.L = q;
  203. else parent.R = q;
  204. } else {
  205. tree._ = q;
  206. }
  207. q.U = parent;
  208. p.U = q;
  209. p.R = q.L;
  210. if (p.R) p.R.U = p;
  211. q.L = p;
  212. }
  213. function RedBlackRotateRight(tree, node) {
  214. var p = node,
  215. q = node.L,
  216. parent = p.U;
  217. if (parent) {
  218. if (parent.L === p) parent.L = q;
  219. else parent.R = q;
  220. } else {
  221. tree._ = q;
  222. }
  223. q.U = parent;
  224. p.U = q;
  225. p.L = q.R;
  226. if (p.L) p.L.U = p;
  227. q.R = p;
  228. }
  229. function RedBlackFirst(node) {
  230. while (node.L) node = node.L;
  231. return node;
  232. }
  233. function createEdge(left, right, v0, v1) {
  234. var edge = [null, null],
  235. index = edges.push(edge) - 1;
  236. edge.left = left;
  237. edge.right = right;
  238. if (v0) setEdgeEnd(edge, left, right, v0);
  239. if (v1) setEdgeEnd(edge, right, left, v1);
  240. cells[left.index].halfedges.push(index);
  241. cells[right.index].halfedges.push(index);
  242. return edge;
  243. }
  244. function createBorderEdge(left, v0, v1) {
  245. var edge = [v0, v1];
  246. edge.left = left;
  247. return edge;
  248. }
  249. function setEdgeEnd(edge, left, right, vertex) {
  250. if (!edge[0] && !edge[1]) {
  251. edge[0] = vertex;
  252. edge.left = left;
  253. edge.right = right;
  254. } else if (edge.left === right) {
  255. edge[1] = vertex;
  256. } else {
  257. edge[0] = vertex;
  258. }
  259. }
  260. // Liang–Barsky line clipping.
  261. function clipEdge(edge, x0, y0, x1, y1) {
  262. var a = edge[0],
  263. b = edge[1],
  264. ax = a[0],
  265. ay = a[1],
  266. bx = b[0],
  267. by = b[1],
  268. t0 = 0,
  269. t1 = 1,
  270. dx = bx - ax,
  271. dy = by - ay,
  272. r;
  273. r = x0 - ax;
  274. if (!dx && r > 0) return;
  275. r /= dx;
  276. if (dx < 0) {
  277. if (r < t0) return;
  278. if (r < t1) t1 = r;
  279. } else if (dx > 0) {
  280. if (r > t1) return;
  281. if (r > t0) t0 = r;
  282. }
  283. r = x1 - ax;
  284. if (!dx && r < 0) return;
  285. r /= dx;
  286. if (dx < 0) {
  287. if (r > t1) return;
  288. if (r > t0) t0 = r;
  289. } else if (dx > 0) {
  290. if (r < t0) return;
  291. if (r < t1) t1 = r;
  292. }
  293. r = y0 - ay;
  294. if (!dy && r > 0) return;
  295. r /= dy;
  296. if (dy < 0) {
  297. if (r < t0) return;
  298. if (r < t1) t1 = r;
  299. } else if (dy > 0) {
  300. if (r > t1) return;
  301. if (r > t0) t0 = r;
  302. }
  303. r = y1 - ay;
  304. if (!dy && r < 0) return;
  305. r /= dy;
  306. if (dy < 0) {
  307. if (r > t1) return;
  308. if (r > t0) t0 = r;
  309. } else if (dy > 0) {
  310. if (r < t0) return;
  311. if (r < t1) t1 = r;
  312. }
  313. if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
  314. if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
  315. if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
  316. return true;
  317. }
  318. function connectEdge(edge, x0, y0, x1, y1) {
  319. var v1 = edge[1];
  320. if (v1) return true;
  321. var v0 = edge[0],
  322. left = edge.left,
  323. right = edge.right,
  324. lx = left[0],
  325. ly = left[1],
  326. rx = right[0],
  327. ry = right[1],
  328. fx = (lx + rx) / 2,
  329. fy = (ly + ry) / 2,
  330. fm,
  331. fb;
  332. if (ry === ly) {
  333. if (fx < x0 || fx >= x1) return;
  334. if (lx > rx) {
  335. if (!v0) v0 = [fx, y0];
  336. else if (v0[1] >= y1) return;
  337. v1 = [fx, y1];
  338. } else {
  339. if (!v0) v0 = [fx, y1];
  340. else if (v0[1] < y0) return;
  341. v1 = [fx, y0];
  342. }
  343. } else {
  344. fm = (lx - rx) / (ry - ly);
  345. fb = fy - fm * fx;
  346. if (fm < -1 || fm > 1) {
  347. if (lx > rx) {
  348. if (!v0) v0 = [(y0 - fb) / fm, y0];
  349. else if (v0[1] >= y1) return;
  350. v1 = [(y1 - fb) / fm, y1];
  351. } else {
  352. if (!v0) v0 = [(y1 - fb) / fm, y1];
  353. else if (v0[1] < y0) return;
  354. v1 = [(y0 - fb) / fm, y0];
  355. }
  356. } else {
  357. if (ly < ry) {
  358. if (!v0) v0 = [x0, fm * x0 + fb];
  359. else if (v0[0] >= x1) return;
  360. v1 = [x1, fm * x1 + fb];
  361. } else {
  362. if (!v0) v0 = [x1, fm * x1 + fb];
  363. else if (v0[0] < x0) return;
  364. v1 = [x0, fm * x0 + fb];
  365. }
  366. }
  367. }
  368. edge[0] = v0;
  369. edge[1] = v1;
  370. return true;
  371. }
  372. function clipEdges(x0, y0, x1, y1) {
  373. var i = edges.length,
  374. edge;
  375. while (i--) {
  376. if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
  377. || !clipEdge(edge, x0, y0, x1, y1)
  378. || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon
  379. || Math.abs(edge[0][1] - edge[1][1]) > epsilon)) {
  380. delete edges[i];
  381. }
  382. }
  383. }
  384. function createCell(site) {
  385. return cells[site.index] = {
  386. site: site,
  387. halfedges: []
  388. };
  389. }
  390. function cellHalfedgeAngle(cell, edge) {
  391. var site = cell.site,
  392. va = edge.left,
  393. vb = edge.right;
  394. if (site === vb) vb = va, va = site;
  395. if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
  396. if (site === va) va = edge[1], vb = edge[0];
  397. else va = edge[0], vb = edge[1];
  398. return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
  399. }
  400. function cellHalfedgeStart(cell, edge) {
  401. return edge[+(edge.left !== cell.site)];
  402. }
  403. function cellHalfedgeEnd(cell, edge) {
  404. return edge[+(edge.left === cell.site)];
  405. }
  406. function sortCellHalfedges() {
  407. for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
  408. if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
  409. var index = new Array(m),
  410. array = new Array(m);
  411. for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
  412. index.sort(function(i, j) { return array[j] - array[i]; });
  413. for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
  414. for (j = 0; j < m; ++j) halfedges[j] = array[j];
  415. }
  416. }
  417. }
  418. function clipCells(x0, y0, x1, y1) {
  419. var nCells = cells.length,
  420. iCell,
  421. cell,
  422. site,
  423. iHalfedge,
  424. halfedges,
  425. nHalfedges,
  426. start,
  427. startX,
  428. startY,
  429. end,
  430. endX,
  431. endY,
  432. cover = true;
  433. for (iCell = 0; iCell < nCells; ++iCell) {
  434. if (cell = cells[iCell]) {
  435. site = cell.site;
  436. halfedges = cell.halfedges;
  437. iHalfedge = halfedges.length;
  438. // Remove any dangling clipped edges.
  439. while (iHalfedge--) {
  440. if (!edges[halfedges[iHalfedge]]) {
  441. halfedges.splice(iHalfedge, 1);
  442. }
  443. }
  444. // Insert any border edges as necessary.
  445. iHalfedge = 0, nHalfedges = halfedges.length;
  446. while (iHalfedge < nHalfedges) {
  447. end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
  448. start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
  449. if (Math.abs(endX - startX) > epsilon || Math.abs(endY - startY) > epsilon) {
  450. halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
  451. Math.abs(endX - x0) < epsilon && y1 - endY > epsilon ? [x0, Math.abs(startX - x0) < epsilon ? startY : y1]
  452. : Math.abs(endY - y1) < epsilon && x1 - endX > epsilon ? [Math.abs(startY - y1) < epsilon ? startX : x1, y1]
  453. : Math.abs(endX - x1) < epsilon && endY - y0 > epsilon ? [x1, Math.abs(startX - x1) < epsilon ? startY : y0]
  454. : Math.abs(endY - y0) < epsilon && endX - x0 > epsilon ? [Math.abs(startY - y0) < epsilon ? startX : x0, y0]
  455. : null)) - 1);
  456. ++nHalfedges;
  457. }
  458. }
  459. if (nHalfedges) cover = false;
  460. }
  461. }
  462. // If there weren’t any edges, have the closest site cover the extent.
  463. // It doesn’t matter which corner of the extent we measure!
  464. if (cover) {
  465. var dx, dy, d2, dc = Infinity;
  466. for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
  467. if (cell = cells[iCell]) {
  468. site = cell.site;
  469. dx = site[0] - x0;
  470. dy = site[1] - y0;
  471. d2 = dx * dx + dy * dy;
  472. if (d2 < dc) dc = d2, cover = cell;
  473. }
  474. }
  475. if (cover) {
  476. var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
  477. cover.halfedges.push(
  478. edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
  479. edges.push(createBorderEdge(site, v01, v11)) - 1,
  480. edges.push(createBorderEdge(site, v11, v10)) - 1,
  481. edges.push(createBorderEdge(site, v10, v00)) - 1
  482. );
  483. }
  484. }
  485. // Lastly delete any cells with no edges; these were entirely clipped.
  486. for (iCell = 0; iCell < nCells; ++iCell) {
  487. if (cell = cells[iCell]) {
  488. if (!cell.halfedges.length) {
  489. delete cells[iCell];
  490. }
  491. }
  492. }
  493. }
  494. var circlePool = [];
  495. var firstCircle;
  496. function Circle() {
  497. RedBlackNode(this);
  498. this.x =
  499. this.y =
  500. this.arc =
  501. this.site =
  502. this.cy = null;
  503. }
  504. function attachCircle(arc) {
  505. var lArc = arc.P,
  506. rArc = arc.N;
  507. if (!lArc || !rArc) return;
  508. var lSite = lArc.site,
  509. cSite = arc.site,
  510. rSite = rArc.site;
  511. if (lSite === rSite) return;
  512. var bx = cSite[0],
  513. by = cSite[1],
  514. ax = lSite[0] - bx,
  515. ay = lSite[1] - by,
  516. cx = rSite[0] - bx,
  517. cy = rSite[1] - by;
  518. var d = 2 * (ax * cy - ay * cx);
  519. if (d >= -epsilon2) return;
  520. var ha = ax * ax + ay * ay,
  521. hc = cx * cx + cy * cy,
  522. x = (cy * ha - ay * hc) / d,
  523. y = (ax * hc - cx * ha) / d;
  524. var circle = circlePool.pop() || new Circle;
  525. circle.arc = arc;
  526. circle.site = cSite;
  527. circle.x = x + bx;
  528. circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
  529. arc.circle = circle;
  530. var before = null,
  531. node = circles._;
  532. while (node) {
  533. if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
  534. if (node.L) node = node.L;
  535. else { before = node.P; break; }
  536. } else {
  537. if (node.R) node = node.R;
  538. else { before = node; break; }
  539. }
  540. }
  541. circles.insert(before, circle);
  542. if (!before) firstCircle = circle;
  543. }
  544. function detachCircle(arc) {
  545. var circle = arc.circle;
  546. if (circle) {
  547. if (!circle.P) firstCircle = circle.N;
  548. circles.remove(circle);
  549. circlePool.push(circle);
  550. RedBlackNode(circle);
  551. arc.circle = null;
  552. }
  553. }
  554. var beachPool = [];
  555. function Beach() {
  556. RedBlackNode(this);
  557. this.edge =
  558. this.site =
  559. this.circle = null;
  560. }
  561. function createBeach(site) {
  562. var beach = beachPool.pop() || new Beach;
  563. beach.site = site;
  564. return beach;
  565. }
  566. function detachBeach(beach) {
  567. detachCircle(beach);
  568. beaches.remove(beach);
  569. beachPool.push(beach);
  570. RedBlackNode(beach);
  571. }
  572. function removeBeach(beach) {
  573. var circle = beach.circle,
  574. x = circle.x,
  575. y = circle.cy,
  576. vertex = [x, y],
  577. previous = beach.P,
  578. next = beach.N,
  579. disappearing = [beach];
  580. detachBeach(beach);
  581. var lArc = previous;
  582. while (lArc.circle
  583. && Math.abs(x - lArc.circle.x) < epsilon
  584. && Math.abs(y - lArc.circle.cy) < epsilon) {
  585. previous = lArc.P;
  586. disappearing.unshift(lArc);
  587. detachBeach(lArc);
  588. lArc = previous;
  589. }
  590. disappearing.unshift(lArc);
  591. detachCircle(lArc);
  592. var rArc = next;
  593. while (rArc.circle
  594. && Math.abs(x - rArc.circle.x) < epsilon
  595. && Math.abs(y - rArc.circle.cy) < epsilon) {
  596. next = rArc.N;
  597. disappearing.push(rArc);
  598. detachBeach(rArc);
  599. rArc = next;
  600. }
  601. disappearing.push(rArc);
  602. detachCircle(rArc);
  603. var nArcs = disappearing.length,
  604. iArc;
  605. for (iArc = 1; iArc < nArcs; ++iArc) {
  606. rArc = disappearing[iArc];
  607. lArc = disappearing[iArc - 1];
  608. setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
  609. }
  610. lArc = disappearing[0];
  611. rArc = disappearing[nArcs - 1];
  612. rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
  613. attachCircle(lArc);
  614. attachCircle(rArc);
  615. }
  616. function addBeach(site) {
  617. var x = site[0],
  618. directrix = site[1],
  619. lArc,
  620. rArc,
  621. dxl,
  622. dxr,
  623. node = beaches._;
  624. while (node) {
  625. dxl = leftBreakPoint(node, directrix) - x;
  626. if (dxl > epsilon) node = node.L; else {
  627. dxr = x - rightBreakPoint(node, directrix);
  628. if (dxr > epsilon) {
  629. if (!node.R) {
  630. lArc = node;
  631. break;
  632. }
  633. node = node.R;
  634. } else {
  635. if (dxl > -epsilon) {
  636. lArc = node.P;
  637. rArc = node;
  638. } else if (dxr > -epsilon) {
  639. lArc = node;
  640. rArc = node.N;
  641. } else {
  642. lArc = rArc = node;
  643. }
  644. break;
  645. }
  646. }
  647. }
  648. createCell(site);
  649. var newArc = createBeach(site);
  650. beaches.insert(lArc, newArc);
  651. if (!lArc && !rArc) return;
  652. if (lArc === rArc) {
  653. detachCircle(lArc);
  654. rArc = createBeach(lArc.site);
  655. beaches.insert(newArc, rArc);
  656. newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
  657. attachCircle(lArc);
  658. attachCircle(rArc);
  659. return;
  660. }
  661. if (!rArc) { // && lArc
  662. newArc.edge = createEdge(lArc.site, newArc.site);
  663. return;
  664. }
  665. // else lArc !== rArc
  666. detachCircle(lArc);
  667. detachCircle(rArc);
  668. var lSite = lArc.site,
  669. ax = lSite[0],
  670. ay = lSite[1],
  671. bx = site[0] - ax,
  672. by = site[1] - ay,
  673. rSite = rArc.site,
  674. cx = rSite[0] - ax,
  675. cy = rSite[1] - ay,
  676. d = 2 * (bx * cy - by * cx),
  677. hb = bx * bx + by * by,
  678. hc = cx * cx + cy * cy,
  679. vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
  680. setEdgeEnd(rArc.edge, lSite, rSite, vertex);
  681. newArc.edge = createEdge(lSite, site, null, vertex);
  682. rArc.edge = createEdge(site, rSite, null, vertex);
  683. attachCircle(lArc);
  684. attachCircle(rArc);
  685. }
  686. function leftBreakPoint(arc, directrix) {
  687. var site = arc.site,
  688. rfocx = site[0],
  689. rfocy = site[1],
  690. pby2 = rfocy - directrix;
  691. if (!pby2) return rfocx;
  692. var lArc = arc.P;
  693. if (!lArc) return -Infinity;
  694. site = lArc.site;
  695. var lfocx = site[0],
  696. lfocy = site[1],
  697. plby2 = lfocy - directrix;
  698. if (!plby2) return lfocx;
  699. var hl = lfocx - rfocx,
  700. aby2 = 1 / pby2 - 1 / plby2,
  701. b = hl / plby2;
  702. if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
  703. return (rfocx + lfocx) / 2;
  704. }
  705. function rightBreakPoint(arc, directrix) {
  706. var rArc = arc.N;
  707. if (rArc) return leftBreakPoint(rArc, directrix);
  708. var site = arc.site;
  709. return site[1] === directrix ? site[0] : Infinity;
  710. }
  711. var epsilon = 1e-6;
  712. var epsilon2 = 1e-12;
  713. var beaches;
  714. var cells;
  715. var circles;
  716. var edges;
  717. function triangleArea(a, b, c) {
  718. return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
  719. }
  720. function lexicographic(a, b) {
  721. return b[1] - a[1]
  722. || b[0] - a[0];
  723. }
  724. function Diagram(sites, extent) {
  725. var site = sites.sort(lexicographic).pop(),
  726. x,
  727. y,
  728. circle;
  729. edges = [];
  730. cells = new Array(sites.length);
  731. beaches = new RedBlackTree;
  732. circles = new RedBlackTree;
  733. while (true) {
  734. circle = firstCircle;
  735. if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
  736. if (site[0] !== x || site[1] !== y) {
  737. addBeach(site);
  738. x = site[0], y = site[1];
  739. }
  740. site = sites.pop();
  741. } else if (circle) {
  742. removeBeach(circle.arc);
  743. } else {
  744. break;
  745. }
  746. }
  747. sortCellHalfedges();
  748. if (extent) {
  749. var x0 = +extent[0][0],
  750. y0 = +extent[0][1],
  751. x1 = +extent[1][0],
  752. y1 = +extent[1][1];
  753. clipEdges(x0, y0, x1, y1);
  754. clipCells(x0, y0, x1, y1);
  755. }
  756. this.edges = edges;
  757. this.cells = cells;
  758. beaches =
  759. circles =
  760. edges =
  761. cells = null;
  762. }
  763. Diagram.prototype = {
  764. constructor: Diagram,
  765. polygons: function() {
  766. var edges = this.edges;
  767. return this.cells.map(function(cell) {
  768. var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
  769. polygon.data = cell.site.data;
  770. return polygon;
  771. });
  772. },
  773. triangles: function() {
  774. var triangles = [],
  775. edges = this.edges;
  776. this.cells.forEach(function(cell, i) {
  777. if (!(m = (halfedges = cell.halfedges).length)) return;
  778. var site = cell.site,
  779. halfedges,
  780. j = -1,
  781. m,
  782. s0,
  783. e1 = edges[halfedges[m - 1]],
  784. s1 = e1.left === site ? e1.right : e1.left;
  785. while (++j < m) {
  786. s0 = s1;
  787. e1 = edges[halfedges[j]];
  788. s1 = e1.left === site ? e1.right : e1.left;
  789. if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
  790. triangles.push([site.data, s0.data, s1.data]);
  791. }
  792. }
  793. });
  794. return triangles;
  795. },
  796. links: function() {
  797. return this.edges.filter(function(edge) {
  798. return edge.right;
  799. }).map(function(edge) {
  800. return {
  801. source: edge.left.data,
  802. target: edge.right.data
  803. };
  804. });
  805. },
  806. find: function(x, y, radius) {
  807. var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
  808. // Use the previously-found cell, or start with an arbitrary one.
  809. while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
  810. var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
  811. // Traverse the half-edges to find a closer cell, if any.
  812. do {
  813. cell = that.cells[i0 = i1], i1 = null;
  814. cell.halfedges.forEach(function(e) {
  815. var edge = that.edges[e], v = edge.left;
  816. if ((v === cell.site || !v) && !(v = edge.right)) return;
  817. var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
  818. if (v2 < d2) d2 = v2, i1 = v.index;
  819. });
  820. } while (i1 !== null);
  821. that._found = i0;
  822. return radius == null || d2 <= radius * radius ? cell.site : null;
  823. }
  824. };
  825. var voronoi = function() {
  826. var x$$1 = x,
  827. y$$1 = y,
  828. extent = null;
  829. function voronoi(data) {
  830. return new Diagram(data.map(function(d, i) {
  831. var s = [Math.round(x$$1(d, i, data) / epsilon) * epsilon, Math.round(y$$1(d, i, data) / epsilon) * epsilon];
  832. s.index = i;
  833. s.data = d;
  834. return s;
  835. }), extent);
  836. }
  837. voronoi.polygons = function(data) {
  838. return voronoi(data).polygons();
  839. };
  840. voronoi.links = function(data) {
  841. return voronoi(data).links();
  842. };
  843. voronoi.triangles = function(data) {
  844. return voronoi(data).triangles();
  845. };
  846. voronoi.x = function(_) {
  847. return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant(+_), voronoi) : x$$1;
  848. };
  849. voronoi.y = function(_) {
  850. return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant(+_), voronoi) : y$$1;
  851. };
  852. voronoi.extent = function(_) {
  853. return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]];
  854. };
  855. voronoi.size = function(_) {
  856. return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
  857. };
  858. return voronoi;
  859. };
  860. exports.voronoi = voronoi;
  861. Object.defineProperty(exports, '__esModule', { value: true });
  862. })));