Dies ist eine einfache Methode, um drei Punkte in der Reihenfolge aus dem Array auszuwählen, zwei vertikale Winkelhalbierende zu finden und deren Schnittpunkt zu zentrieren.
import numpy as np
import matplotlib.pyplot as plt
import random
#Gesamtzahl der Punkte
N = 4
#xy ist Eingabe, xy_o Ausgänge
#Beide sind zweidimensionale Arrays und Formen.[[x1, y1], [x2, y2], [x3, y3], ...]
def circle_c(xy):
#Da 3 Punkte verwendet werden, um den Mittelpunkt des Kreises zu finden, wird die Ausgabe um 2 Punkte reduziert.
xy_o_len = len(xy) - 2
#Stellen Sie das Array für die Ausgabe ein.
xy_o = np.zeros((xy_o_len, 2))
#Finden Sie den Mittelpunkt des Kreises in der Reihenfolge von vorne um 3 Punkte.
for i in range(xy_o_len):
#Hilfsberechnung
x12 = xy[i+0, 0] + xy[i+1, 0]
# x13 = xy[i+0, 0] + xy[i+2, 0]
x23 = xy[i+1, 0] + xy[i+2, 0]
x21 = xy[i+1, 0] - xy[i+0, 0]
# x31 = xy[i+2, 0] - xy[i+0, 0]
x32 = xy[i+2, 0] - xy[i+1, 0]
y12 = xy[i+0, 1] + xy[i+1, 1]
# y13 = xy[i+0, 1] + xy[i+2, 1]
# y23 = xy[i+1, 1] + xy[i+2, 1]
y21 = xy[i+1, 1] - xy[i+0, 1]
y31 = xy[i+2, 1] - xy[i+0, 1]
y32 = xy[i+2, 1] - xy[i+1, 1]
#Berechnen Sie den Mittelpunkt des Kreises
xy_o[i, 0] = (y31 - x21*x12/y21 + x32*x23/y32)*0.5 / (x32/y32 - x21/y21) #x Komponente
xy_o[i, 1] = -(xy_o[i, 0] - x12 * 0.5)*x21/y21 + y12*0.5 #y-Komponente
return xy_o
x = np.arange(N)
y = np.random.rand(N)
xy = np.c_[x, y]
cxy = circle_c(xy)
f = plt.subplot()
f.plot(xy[:, 0], xy[:, 1], marker='.', markersize=20)
f.scatter(cxy[:, 0], cxy[:, 1], s=900, c="pink", alpha=0.5, linewidths="2", edgecolors="red")
f.set_aspect('equal')
plt.show()
Recommended Posts