Oto prosta metoda, z działającą implementacją, którą zrzuciłem razem.
http://jsfiddle.net/kBsdW/29/
- Loop przez punkty
- Znajdź drugi punkt z maksymalną odległością od pierwszego
- Record od odległości
- Kiedy masz wszystkie Maxa odległościach uśrednić je i obliczyć tolerancja błędu:
- Sprawdź wszystkie zarejestrowane dystanse na podstawie tolerancji błędów
Działa to doskonale do wprowadzania danych przez użytkownika, jak z myszy lub czujnika dotykowego. Algorytm ten ma postać O (n^2) i wykorzystuje deltowy dystans maksymalny w przeciwieństwie do znajdowania środka masy i sprawdzania odległości promieni.
"Wydaje się" być bardziej wydajnym niż metoda najlepszego dopasowania, która musi obliczyć przy każdej kombinacji 3 punktów.
Ten hack ~ algo wykorzystuje fakt, że maksymalna odległość między dwoma punktami na okręgu to średnica okręgu.
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;
}
Czy możesz podać dokładniejsze informacje na temat tego, co próbujesz osiągnąć? – Alexandros
Co to jest niedoskonały krąg? –
Co powiesz teraz? – Afra