Skip to content

Commit f45a98b

Browse files
committed
Fixed a problem with big numbers in packEnclose
1 parent 563dd3a commit f45a98b

File tree

2 files changed

+34
-13
lines changed

2 files changed

+34
-13
lines changed

src/pack/enclose.js

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,28 @@ export default function(circles) {
88
export function packEncloseRandom(circles, random) {
99
var i = 0, n = (circles = shuffle(Array.from(circles), random)).length, B = [], p, e;
1010

11+
var minX = Number.MAX_VALUE, minY = Number.MAX_VALUE;
12+
var maxX = Number.MIN_VALUE, maxY = Number.MIN_VALUE;
13+
for (var k = 0; k < n; ++k) {
14+
var c = circles[k];
15+
minX = Math.min(minX, c.x - c.r);
16+
minY = Math.min(minY, c.y - c.r);
17+
maxX = Math.max(maxX, c.x + c.r);
18+
maxY = Math.max(maxY, c.y + c.r);
19+
}
20+
21+
var cx = (minX + maxX) / 2, cy = (minY + maxY) / 2;
22+
1123
while (i < n) {
1224
p = circles[i];
1325
if (e && enclosesWeak(e, p)) ++i;
14-
else e = encloseBasis(B = extendBasis(B, p)), i = 0;
26+
else e = encloseBasis(B = extendBasis(B, p, cx, cy), cx, cy), i = 0;
1527
}
1628

1729
return e;
1830
}
1931

20-
function extendBasis(B, p) {
32+
function extendBasis(B, p, cx, cy) {
2133
var i, j;
2234

2335
if (enclosesWeakAll(p, B)) return [p];
@@ -36,7 +48,7 @@ function extendBasis(B, p) {
3648
if (enclosesNot(encloseBasis2(B[i], B[j]), p)
3749
&& enclosesNot(encloseBasis2(B[i], p), B[j])
3850
&& enclosesNot(encloseBasis2(B[j], p), B[i])
39-
&& enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
51+
&& enclosesWeakAll(encloseBasis3(B[i], B[j], p, cx, cy), B)) {
4052
return [B[i], B[j], p];
4153
}
4254
}
@@ -65,11 +77,11 @@ function enclosesWeakAll(a, B) {
6577
return true;
6678
}
6779

68-
function encloseBasis(B) {
80+
function encloseBasis(B, cx, cy) {
6981
switch (B.length) {
7082
case 1: return encloseBasis1(B[0]);
7183
case 2: return encloseBasis2(B[0], B[1]);
72-
case 3: return encloseBasis3(B[0], B[1], B[2]);
84+
case 3: return encloseBasis3(B[0], B[1], B[2], cx, cy);
7385
}
7486
}
7587

@@ -93,10 +105,10 @@ function encloseBasis2(a, b) {
93105
};
94106
}
95107

96-
function encloseBasis3(a, b, c) {
97-
var x1 = a.x, y1 = a.y, r1 = a.r,
98-
x2 = b.x, y2 = b.y, r2 = b.r,
99-
x3 = c.x, y3 = c.y, r3 = c.r,
108+
function encloseBasis3(a, b, c, cx, cy) {
109+
var x1 = a.x - cx, y1 = a.y - cy, r1 = a.r,
110+
x2 = b.x - cx, y2 = b.y - cy, r2 = b.r,
111+
x3 = c.x - cx, y3 = c.y - cy, r3 = c.r,
100112
a2 = x1 - x2,
101113
a3 = x1 - x3,
102114
b2 = y1 - y2,
@@ -116,8 +128,8 @@ function encloseBasis3(a, b, c) {
116128
C = xa * xa + ya * ya - r1 * r1,
117129
r = -(Math.abs(A) > 1e-6 ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
118130
return {
119-
x: x1 + xa + xb * r,
120-
y: y1 + ya + yb * r,
131+
x: cx + x1 + xa + xb * r,
132+
y: cy + y1 + ya + yb * r,
121133
r: r
122134
};
123135
}

test/pack/enclose-test.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,18 @@ it("packEnclose(circles) handles a tricky case", () => {
1010
{x: 15.5, y: 73.5, r: 8.585}
1111
]),
1212
{
13-
r: 20.790781637717107,
14-
x: 12.80193548387092,
13+
r: 20.790781637717117,
14+
x: 12.80193548387097,
1515
y: 61.59615384615385
1616
}
1717
);
1818
});
19+
20+
it('packEnclose(circles) handles big numbers', () => {
21+
const circles = [
22+
{ "x": 531214.7271532917, "y": 360738.8204573899, "r": 10 },
23+
{ "x": 531242.0429781883, "y": 360764.87727581244, "r": 10 },
24+
{ "x": 531239.7927335791, "y": 360716.54336245544, "r": 10 }
25+
];
26+
assert.doesNotThrow(() => packEnclose(circles));
27+
});

0 commit comments

Comments
 (0)