source: node_modules/victory-vendor/lib-vendor/d3-voronoi/src/Beach.js

Last change on this file was a762898, checked in by istevanoska <ilinastevanoska@…>, 6 months ago

Added visualizations

  • Property mode set to 100644
File size: 4.6 KB
Line 
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.addBeach = addBeach;
7exports.removeBeach = removeBeach;
8var _RedBlackTree = require("./RedBlackTree");
9var _Cell = require("./Cell");
10var _Circle = require("./Circle");
11var _Edge = require("./Edge");
12var _Diagram = require("./Diagram");
13var beachPool = [];
14function Beach() {
15 (0, _RedBlackTree.RedBlackNode)(this);
16 this.edge = this.site = this.circle = null;
17}
18function createBeach(site) {
19 var beach = beachPool.pop() || new Beach();
20 beach.site = site;
21 return beach;
22}
23function detachBeach(beach) {
24 (0, _Circle.detachCircle)(beach);
25 _Diagram.beaches.remove(beach);
26 beachPool.push(beach);
27 (0, _RedBlackTree.RedBlackNode)(beach);
28}
29function 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}
69function 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}
141function 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}
160function 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}
Note: See TracBrowser for help on using the repository browser.