这是用给定的准确度绘制点“递归”的代码。对于accuracy = 1,它会绘制所有点的质心坐标。对于accuracy = 2,它会绘制所有点的质心的坐标以及点的质心的质心,等等……
import matplotlib.pyplot as plt
from itertools import combinations
def centroids(prev_centroid, coordinates, accuracy):
if accuracy == 0:
return list(set([tuple(ti) for ti in prev_centroid]))
centroid_list = []
for point1, point2, point3 in combinations(coordinates, 3):
x = (point1[0] + point2[0] + point3[0])/3
y = (point1[1] + point2[1] + point3[1])/3
centroid_list.append([x, y])
prev_centroid += centroid_list
return centroids(prev_centroid, centroid_list, accuracy-1)
coordinates = *your_coordinates*
accuracy = *your_accuracy*
prev_centroid = []
coordinates_to_plot = centroids(prev_centroid, coordinates, accuracy)
xcoordinates = []
ycoordinates = []
for a in coordinates_to_plot:
xcoordinates.append(a[0])
ycoordinates.append(a[1])
plt.plot([xcoordinates], [ycoordinates], "o")
plt.show()
注意:您必须已经为此代码安装了 matplotlib 和 itertools 库。
代码说明:
def centroids(prev_centroid, coordinates, accuracy):
if accuracy == 0:
return list(set([tuple(ti) for ti in prev_centroid]))
centroid_list = []
for point1, point2, point3 in combinations(coordinates, 3):
x = (point1[0] + point2[0] + point3[0])/3
y = (point1[1] + point2[1] + point3[1])/3
centroid_list.append([x, y])
return centroids(prev_centroid + centroid_list, centroid_list, accuracy-1)
这是程序最重要的功能,它需要 2 个列表(prev_centroid、coordinates)和一个整数(accuracy)。它使用所有坐标来计算它们各自的质心,并将所有坐标附加到名为centroid_list 的列表中。然后它再次调用函数 centroids() 递归 并调用 accuracy 为 previous_accuracy_minus_1 和 prev_centroid 为 prev_centroid + centroid_list 和 coordinates 为 centroid_list 因为我们想要这些质心坐标作为下一次质心计算的初始坐标。此外,我们在此函数中设置了条件,即如果accuracy 变为零,则函数实质上停止。