Tengo un conjunto de círculos con ubicaciones y radios dados en un plano bidimensional. Quiero determinar para cada círculo si se está cruzando con cualquier otro círculo y la distancia que se necesita para separar los dos. Bajo mi implementación actual, examino todas las posibles combinaciones de círculos y luego hago los cálculos. Desafortunadamente, este algoritmo es O (n^2), que es lento.Distancia de separación del círculo - Vecino más cercano Problema
Los círculos generalmente se agruparán en grupos, y tendrán radios similares (pero diferentes). El máximo aproximado para el número de círculos es alrededor de 200. El algoritmo no tiene que ser exacto, pero debe estar cerca.
Aquí está una (lenta) aplicación actualmente tengo en 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++;
}
Además, yo apreciaría si usted explicó un buen algoritmo (KD árbol?) En la llanura Inglés: -/
Mire esta respuesta http://stackoverflow.com/questions/3265986/an-algorithm-to-space-out-overlapping- rectángulos/3279877 # 3279877 –
[Barrido y poda] (http://en.wikipedia.org/wiki/Sweep_and_prune) puede valer la pena investigar. No ayudará con la ubicación real, por supuesto. También un "truco rápido" es deshacerse del 'sqrt' para los cheques porque' sqrt (x) <= sqrt (y) 'implica' x <= y' para números reales positivos. –