| 1 | "use strict";
|
|---|
| 2 |
|
|---|
| 3 | Object.defineProperty(exports, "__esModule", {
|
|---|
| 4 | value: true
|
|---|
| 5 | });
|
|---|
| 6 | exports.addBeach = addBeach;
|
|---|
| 7 | exports.removeBeach = removeBeach;
|
|---|
| 8 | var _RedBlackTree = require("./RedBlackTree");
|
|---|
| 9 | var _Cell = require("./Cell");
|
|---|
| 10 | var _Circle = require("./Circle");
|
|---|
| 11 | var _Edge = require("./Edge");
|
|---|
| 12 | var _Diagram = require("./Diagram");
|
|---|
| 13 | var beachPool = [];
|
|---|
| 14 | function Beach() {
|
|---|
| 15 | (0, _RedBlackTree.RedBlackNode)(this);
|
|---|
| 16 | this.edge = this.site = this.circle = null;
|
|---|
| 17 | }
|
|---|
| 18 | function createBeach(site) {
|
|---|
| 19 | var beach = beachPool.pop() || new Beach();
|
|---|
| 20 | beach.site = site;
|
|---|
| 21 | return beach;
|
|---|
| 22 | }
|
|---|
| 23 | function detachBeach(beach) {
|
|---|
| 24 | (0, _Circle.detachCircle)(beach);
|
|---|
| 25 | _Diagram.beaches.remove(beach);
|
|---|
| 26 | beachPool.push(beach);
|
|---|
| 27 | (0, _RedBlackTree.RedBlackNode)(beach);
|
|---|
| 28 | }
|
|---|
| 29 | function removeBeach(beach) {
|
|---|
| 30 | var circle = beach.circle,
|
|---|
| 31 | x = circle.x,
|
|---|
| 32 | y = circle.cy,
|
|---|
| 33 | vertex = [x, y],
|
|---|
| 34 | previous = beach.P,
|
|---|
| 35 | next = beach.N,
|
|---|
| 36 | disappearing = [beach];
|
|---|
| 37 | detachBeach(beach);
|
|---|
| 38 | var lArc = previous;
|
|---|
| 39 | while (lArc.circle && Math.abs(x - lArc.circle.x) < _Diagram.epsilon && Math.abs(y - lArc.circle.cy) < _Diagram.epsilon) {
|
|---|
| 40 | previous = lArc.P;
|
|---|
| 41 | disappearing.unshift(lArc);
|
|---|
| 42 | detachBeach(lArc);
|
|---|
| 43 | lArc = previous;
|
|---|
| 44 | }
|
|---|
| 45 | disappearing.unshift(lArc);
|
|---|
| 46 | (0, _Circle.detachCircle)(lArc);
|
|---|
| 47 | var rArc = next;
|
|---|
| 48 | while (rArc.circle && Math.abs(x - rArc.circle.x) < _Diagram.epsilon && Math.abs(y - rArc.circle.cy) < _Diagram.epsilon) {
|
|---|
| 49 | next = rArc.N;
|
|---|
| 50 | disappearing.push(rArc);
|
|---|
| 51 | detachBeach(rArc);
|
|---|
| 52 | rArc = next;
|
|---|
| 53 | }
|
|---|
| 54 | disappearing.push(rArc);
|
|---|
| 55 | (0, _Circle.detachCircle)(rArc);
|
|---|
| 56 | var nArcs = disappearing.length,
|
|---|
| 57 | iArc;
|
|---|
| 58 | for (iArc = 1; iArc < nArcs; ++iArc) {
|
|---|
| 59 | rArc = disappearing[iArc];
|
|---|
| 60 | lArc = disappearing[iArc - 1];
|
|---|
| 61 | (0, _Edge.setEdgeEnd)(rArc.edge, lArc.site, rArc.site, vertex);
|
|---|
| 62 | }
|
|---|
| 63 | lArc = disappearing[0];
|
|---|
| 64 | rArc = disappearing[nArcs - 1];
|
|---|
| 65 | rArc.edge = (0, _Edge.createEdge)(lArc.site, rArc.site, null, vertex);
|
|---|
| 66 | (0, _Circle.attachCircle)(lArc);
|
|---|
| 67 | (0, _Circle.attachCircle)(rArc);
|
|---|
| 68 | }
|
|---|
| 69 | function addBeach(site) {
|
|---|
| 70 | var x = site[0],
|
|---|
| 71 | directrix = site[1],
|
|---|
| 72 | lArc,
|
|---|
| 73 | rArc,
|
|---|
| 74 | dxl,
|
|---|
| 75 | dxr,
|
|---|
| 76 | node = _Diagram.beaches._;
|
|---|
| 77 | while (node) {
|
|---|
| 78 | dxl = leftBreakPoint(node, directrix) - x;
|
|---|
| 79 | if (dxl > _Diagram.epsilon) node = node.L;else {
|
|---|
| 80 | dxr = x - rightBreakPoint(node, directrix);
|
|---|
| 81 | if (dxr > _Diagram.epsilon) {
|
|---|
| 82 | if (!node.R) {
|
|---|
| 83 | lArc = node;
|
|---|
| 84 | break;
|
|---|
| 85 | }
|
|---|
| 86 | node = node.R;
|
|---|
| 87 | } else {
|
|---|
| 88 | if (dxl > -_Diagram.epsilon) {
|
|---|
| 89 | lArc = node.P;
|
|---|
| 90 | rArc = node;
|
|---|
| 91 | } else if (dxr > -_Diagram.epsilon) {
|
|---|
| 92 | lArc = node;
|
|---|
| 93 | rArc = node.N;
|
|---|
| 94 | } else {
|
|---|
| 95 | lArc = rArc = node;
|
|---|
| 96 | }
|
|---|
| 97 | break;
|
|---|
| 98 | }
|
|---|
| 99 | }
|
|---|
| 100 | }
|
|---|
| 101 | (0, _Cell.createCell)(site);
|
|---|
| 102 | var newArc = createBeach(site);
|
|---|
| 103 | _Diagram.beaches.insert(lArc, newArc);
|
|---|
| 104 | if (!lArc && !rArc) return;
|
|---|
| 105 | if (lArc === rArc) {
|
|---|
| 106 | (0, _Circle.detachCircle)(lArc);
|
|---|
| 107 | rArc = createBeach(lArc.site);
|
|---|
| 108 | _Diagram.beaches.insert(newArc, rArc);
|
|---|
| 109 | newArc.edge = rArc.edge = (0, _Edge.createEdge)(lArc.site, newArc.site);
|
|---|
| 110 | (0, _Circle.attachCircle)(lArc);
|
|---|
| 111 | (0, _Circle.attachCircle)(rArc);
|
|---|
| 112 | return;
|
|---|
| 113 | }
|
|---|
| 114 | if (!rArc) {
|
|---|
| 115 | // && lArc
|
|---|
| 116 | newArc.edge = (0, _Edge.createEdge)(lArc.site, newArc.site);
|
|---|
| 117 | return;
|
|---|
| 118 | }
|
|---|
| 119 |
|
|---|
| 120 | // else lArc !== rArc
|
|---|
| 121 | (0, _Circle.detachCircle)(lArc);
|
|---|
| 122 | (0, _Circle.detachCircle)(rArc);
|
|---|
| 123 | var lSite = lArc.site,
|
|---|
| 124 | ax = lSite[0],
|
|---|
| 125 | ay = lSite[1],
|
|---|
| 126 | bx = site[0] - ax,
|
|---|
| 127 | by = site[1] - ay,
|
|---|
| 128 | rSite = rArc.site,
|
|---|
| 129 | cx = rSite[0] - ax,
|
|---|
| 130 | cy = rSite[1] - ay,
|
|---|
| 131 | d = 2 * (bx * cy - by * cx),
|
|---|
| 132 | hb = bx * bx + by * by,
|
|---|
| 133 | hc = cx * cx + cy * cy,
|
|---|
| 134 | vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
|
|---|
| 135 | (0, _Edge.setEdgeEnd)(rArc.edge, lSite, rSite, vertex);
|
|---|
| 136 | newArc.edge = (0, _Edge.createEdge)(lSite, site, null, vertex);
|
|---|
| 137 | rArc.edge = (0, _Edge.createEdge)(site, rSite, null, vertex);
|
|---|
| 138 | (0, _Circle.attachCircle)(lArc);
|
|---|
| 139 | (0, _Circle.attachCircle)(rArc);
|
|---|
| 140 | }
|
|---|
| 141 | function leftBreakPoint(arc, directrix) {
|
|---|
| 142 | var site = arc.site,
|
|---|
| 143 | rfocx = site[0],
|
|---|
| 144 | rfocy = site[1],
|
|---|
| 145 | pby2 = rfocy - directrix;
|
|---|
| 146 | if (!pby2) return rfocx;
|
|---|
| 147 | var lArc = arc.P;
|
|---|
| 148 | if (!lArc) return -Infinity;
|
|---|
| 149 | site = lArc.site;
|
|---|
| 150 | var lfocx = site[0],
|
|---|
| 151 | lfocy = site[1],
|
|---|
| 152 | plby2 = lfocy - directrix;
|
|---|
| 153 | if (!plby2) return lfocx;
|
|---|
| 154 | var hl = lfocx - rfocx,
|
|---|
| 155 | aby2 = 1 / pby2 - 1 / plby2,
|
|---|
| 156 | b = hl / plby2;
|
|---|
| 157 | if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
|
|---|
| 158 | return (rfocx + lfocx) / 2;
|
|---|
| 159 | }
|
|---|
| 160 | function rightBreakPoint(arc, directrix) {
|
|---|
| 161 | var rArc = arc.N;
|
|---|
| 162 | if (rArc) return leftBreakPoint(rArc, directrix);
|
|---|
| 163 | var site = arc.site;
|
|---|
| 164 | return site[1] === directrix ? site[0] : Infinity;
|
|---|
| 165 | } |
|---|