diff --git a/src/pack/enclose.js b/src/pack/enclose.js index ae2d7f26..f6eb67f1 100644 --- a/src/pack/enclose.js +++ b/src/pack/enclose.js @@ -114,7 +114,7 @@ function encloseBasis3(a, b, c) { A = xb * xb + yb * yb - 1, B = 2 * (r1 + xa * xb + ya * yb), C = xa * xa + ya * ya - r1 * r1, - r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); + r = -(Math.abs(A) > 1e-6 ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); return { x: x1 + xa + xb * r, y: y1 + ya + yb * r, diff --git a/test/pack/enclose-test.js b/test/pack/enclose-test.js new file mode 100644 index 00000000..b69714b1 --- /dev/null +++ b/test/pack/enclose-test.js @@ -0,0 +1,18 @@ +import assert from "assert"; +import {packEnclose} from "../../src/index.js"; + +// https://github.com/d3/d3-hierarchy/issues/188 +it("packEnclose(circles) handles a tricky case", () => { + assert.deepStrictEqual( + packEnclose([ + {x: 14.5, y: 48.5, r: 7.585}, + {x: 9.5, y: 79.5, r: 2.585}, + {x: 15.5, y: 73.5, r: 8.585} + ]), + { + r: 20.790781637717107, + x: 12.80193548387092, + y: 61.59615384615385 + } + ); +});