3 ms·
You can solve by finding the point <x, y> that minimizes the distance from any point in any input circle: \sqrt{(x_p - x) ^ 2 + (y_p - y) ^ 2} + r_p for p ∈ L.
by mbostock 9y ago
You can solve by finding the point <x, y> that minimizes the distance from any point in any input circle: \sqrt{(x_p - x) ^ 2 + (y_p - y) ^ 2} + r_p for p ∈ L. This is the center of the smallest enclosing circle. Once you have the center, you can iterate over every input circle to compute its radius.
- arnioxux 9y agoThat's clever! I updated the code and it seems to work for the several times I refreshed now. Thanks! This was the final cost function that worked: let encloseCost = 0; let farthestPointCost = 0; for (let i = 0; i < B.length; i++) { const b = B[i]; const dx = b.x - a.x; const dy = b.y - a.y; encloseCost += Math.max( 0, -a.r + (b.r + Math.sqrt(dx * dx + dy * dy)) ); farthestPointCost = Math.max( farthestPointCost, b.r + Math.sqrt(dx * dx + dy * dy) ); } const radiusCost = Math.abs(a.r); const totalCost = encloseCost + farthestPointCost + radiusCost;