Ho un set di cerchi con posizioni e raggi dati su un piano bidimensionale. Voglio determinare per ogni cerchio se si interseca con qualsiasi altro cerchio e la distanza necessaria per separare i due. Sotto la mia attuale implementazione, passo semplicemente a tutte le possibili combinazioni di cerchi e poi eseguo i calcoli. Sfortunatamente, questo algoritmo è O (n^2), che è lento.Distanza di separazione cerchio - Problema vicino più prossimo
I cerchi saranno generalmente raggruppati in gruppi e avranno raggi simili (ma diversi). Il massimo approssimativo per il numero di cerchi è intorno a 200. L'algoritmo non deve essere esatto, ma dovrebbe essere vicino.
Ecco un (lento) implementazione Al momento ho in 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++;
}
Inoltre, le sarei grato se lei ha spiegato un buon algoritmo (KD Tree?) In parole povere: -/
Guarda questa risposta http://stackoverflow.com/questions/3265986/an-algorithm-to-space-out-overlapping- rettangoli/3279877 # 3279877 –
[Sweep e potare] (http://en.wikipedia.org/wiki/Sweep_and_prune) potrebbe valere la pena di essere esaminato. Non sarà di aiuto con la posizione effettiva, ovviamente. Anche un "attacco rapido" è quello di sbarazzarsi di 'sqrt' per i controlli perché' sqrt (x) <= sqrt (y) 'implica' x <= y' per i numeri reali positivi. –