Aquí hay un método simple, con una implementación de trabajo que lancé.
http://jsfiddle.net/kBsdW/29/
- bucle a través de los puntos
- Encuentra un segundo punto con la distancia máxima desde el primer
- Registre la distancia
- Una vez que tenga todas las distancias Max los promedio y calcular la tolerancia de error
- Compruebe todas las distancias registradas contra su tolerancia de error
Esto funciona muy bien para la entrada del usuario, como un mouse o un sensor táctil. Este algoritmo es O (n^2) y utiliza la distancia máxima delta en lugar de encontrar el centro de masa y verificar distancias de radios.
"Parece" ser más eficiente que el método del mejor círculo que debe calcularse en cada combinación de 3 puntos.
Este truco ~ algo aprovecha el hecho de que la distancia máxima entre dos puntos en un círculo es el diámetro del círculo.
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;
}
¿Podría ser más específico en lo que está tratando de lograr? – Alexandros
¿Qué es un círculo imperfecto? –
¿Qué tal ahora? – Afra