Es ist ganz einfach eine gewisse Annäherung zu finden:
def find_circle_deterministically(x,y):
center = x.mean(), y.mean()
radius = np.sqrt((x-center[0])**2 + (y-center[1])**2).mean()
return center, radius
Erklärt: die Mitte des Kreises auf den Mittelwert x gesetzt und y Ihrer Punkte bedeuten. Bestimmen Sie dann für jeden Punkt den Abstand zum Mittelpunkt und nehmen Sie den Mittelwert über alle Punkte. Das ist dein Radius.
Das komplette Skript:
import numpy as np
import matplotlib.pyplot as plt
n_points = 10
radius = 4
noise_std = 0.3
angles = np.linspace(0,2*np.pi,n_points,False)
x = np.cos(angles) * radius
y = np.sin(angles) * radius
x += np.random.normal(0,noise_std,x.shape)
y += np.random.normal(0,noise_std,y.shape)
plt.axes(aspect="equal")
plt.plot(x,y,"bx")
def find_circle_deterministically(x,y):
center = x.mean(), y.mean()
radius = np.sqrt((x-center[0])**2 + (y-center[1])**2).mean()
return center, radius
center, radius2 = find_circle_deterministically(x,y)
angles2 = np.linspace(0,2*np.pi,100,True)
x2 = center[0] + np.cos(angles2) * radius2
y2 = center[1] + np.sin(angles2) * radius2
plt.plot(x2,y2,"r-")
plt.show()
produziert dieses Grundstück:
Diese gute Arbeit, wie Sie Polygone mit Messfehler haben. Wenn Ihre Punkte nicht annähernd gleichmäßig über die Winkel [0,2pi[
verteilt sind, wird die Leistung schlecht.
Allgemeiner könnten Sie Optimierung verwenden.
Vielleicht können Sie die Methode der kleinsten Quadrate verwenden. [Hier ist eine PDF-Datei] (http://www.emis.de/journals/BBMS/Bulletin/sup962/gander.pdf) eines Papiers über die Suche nach einem Kreis nach der Methode der kleinsten Quadrate. Es könnte ein bisschen komplex sein für das, was Sie tun, obwohl. Wenn die Punkte ungefähr einen Kreis bilden, können Sie wahrscheinlich eine elementarere Methode finden, die gut funktioniert. – William
Kleinste Quadrate scheint der Weg zu gehen, wenn Sie das Zentrum bereits kennen. Es wird im Wesentlichen ein Kurvenanpassungsproblem mit Polarkoordinaten. – Kevin
Überprüfen Sie die [Hough-Transformation] (http://en.wikipedia.org/wiki/Hough_transform). Es führt zu einer einfachen Kreisdetektionslösung. – Simon