Il s'agit d'une méthode simple pour sélectionner trois points dans l'ordre dans le tableau, trouver deux bissectrices verticales et centrer leur intersection.
import numpy as np
import matplotlib.pyplot as plt
import random
#Nombre total de points
N = 4
#xy est une entrée, xy_o sorties
#Les deux sont des tableaux et des formes bidimensionnels,[[x1, y1], [x2, y2], [x3, y3], ...]
def circle_c(xy):
#Puisque 3 points sont utilisés pour trouver le centre du cercle, la sortie est réduite de 2 points.
xy_o_len = len(xy) - 2
#Définissez le tableau pour la sortie.
xy_o = np.zeros((xy_o_len, 2))
#Trouvez le centre du cercle par 3 points dans l'ordre à partir de l'avant.
for i in range(xy_o_len):
#Calcul auxiliaire
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]
#Calculez le centre du cercle
xy_o[i, 0] = (y31 - x21*x12/y21 + x32*x23/y32)*0.5 / (x32/y32 - x21/y21) #x composant
xy_o[i, 1] = -(xy_o[i, 0] - x12 * 0.5)*x21/y21 + y12*0.5 #composant y
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