我有一套給定位置和半徑在二維平面上的圓。我想確定每個圓是否與任何其他圓相交以及將兩者分開所需的距離。在我目前的實施中,我只是通過所有可能的圓組合,然後進行計算。不幸的是,這個算法是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樹): -/
看看這個答案http://stackoverflow.com/questions/3265986/an-algorithm-to-space-out-overlapping-矩形/ 3279877#3279877 – 2011-01-31 03:08:29
[Sweep and prune](http://en.wikipedia.org/wiki/Sweep_and_prune)可能值得研究。當然,它無助於實際的放置。另外一個「快速黑客」是爲了檢查而去除`sqrt`,因爲對於正實數,sqrt(x)<= sqrt(y)`暗示`x <= y`。 – 2011-01-31 03:19:53