Ecco un metodo semplice, con un'implementazione funzionante che ho creato.
http://jsfiddle.net/kBsdW/29/
- Loop attraverso i punti
- Trova un secondo punto con la massima distanza dal primo
- Registra la distanza
- Una volta che avete tutte le distanze max loro media e calcolare la tolleranza di errore
- Controllare tutte le distanze registrate rispetto alla tolleranza di errore
Questo funziona perfettamente per l'input dell'utente come da un mouse o sensore tattile. Questo algoritmo è O (n^2) e utilizza la distanza massima delta anziché trovare il centro di massa e controllare le distanze dei raggi.
"sembra" essere più efficiente del metodo best-fit-circle che deve calcolare su ogni combinazione di 3 punti.
Questo trucchetto si avvantaggia del fatto che la distanza massima tra due punti su un cerchio corrisponde al diametro del cerchio.
function isCircle(points, error) {
if(points.length <= 2) return true;
var weights = [];
var maxDistance = 0;
var sumDistance = 0;
var avgDistance = 0;
var errorConstraint = 0;
for(var i=0; i<points.length; i++) {
var distance = 0;
for(var j=0; j<points.length; j++) {
var d = getDistance(points[i], points[j]);
if(d > distance) {
distance = d;
}
}
if(distance > 0) {
if(distance > maxDistance) maxDistance = distance;
sumDistance += distance;
weights.push(distance);
}
}
avgDistance = sumDistance/weights.length;
errorConstraint = error * avgDistance;
for(var i=0; i<weights.length; i++) {
if(Math.abs(avgDistance - weights[i]) > errorConstraint) {
return false;
}
}
return true;
}
fonte
2012-01-30 17:13:59
Potresti essere più specifico in quello che stai cercando di realizzare? – Alexandros
Cos'è un cerchio imperfetto? –
E adesso? – Afra