2次元平面上に特定の位置と半径を持つ一連の円があります。すべての円について、他の円と交差しているかどうか、および 2 つを分離するために必要な距離を判断したいと考えています。私の現在の実装では、考えられるすべての円の組み合わせを調べてから計算を行います。残念ながら、このアルゴリズムは O(n^2) であり、低速です。
円は通常、グループにまとめられ、半径は似ていますが異なります。円の数のおおよその最大値は約 200 です。アルゴリズムは正確である必要はありませんが、それに近い必要があります。
これは私が現在 JavaScript で持っている (遅い) 実装です:
// Makes a new circle
var circle = function(x,y,radius) {
return {
x:x,
y:y,
radius:radius
};
};
// These points are not representative of the true data set. I just made them up.
var points = [
circle(3,3,2),
circle(7,5,4),
circle(16,6,4),
circle(17,12,3),
circle(26,20,1)
];
var k = 0,
len = points.length;
for (var i = 0; i < len; i++) {
for (var j = k; j < len; j++) {
if (i !== j) {
var c1 = points[i],
c2 = points[j],
radiiSum = c1.radius+c2.radius,
deltaX = Math.abs(c1.x-c2.x);
if (deltaX < radiiSum) {
var deltaY = Math.abs(c1.y-c2.y);
if (deltaY < radiiSum) {
var distance = Math.sqrt(deltaX*deltaX+deltaY*deltaY);
if (distance < radiiSum) {
var separation = radiiSum - distance;
console.log(c1,c2,separation);
}
}
}
}
}
k++;
}
また、よいアルゴリズム(KD Tree?)を分かりやすい英語で説明していただけるとありがたいです:-/