如何递归绘制一组给定点的质心?

问题描述

假设我有一个已知坐标的点。我想编写代码,逐步绘制这些点的所有可能组合的质心,然后使用所有点(包括先前绘制的质心)重复相同的操作。

但是,我不知道我应该使用 python 中的哪些库或如何使用,或者甚至 python 是否是此类内容的最佳语言。如果更适合我的目的,我愿意学习任何其他语言。

我很想知道给定不同的初始点(主要是多边形的顶点),图形如何演变。

编辑:通过递归,我的意思是从 n 个点开始,我得到 nC3 个质心。接下来我将使用 n + nC3 个点作为我的初始点来找出下一组质心

解决方法

这是将“递归”绘制点的代码,具有给定的精度。对于 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,accuracy)

xcoordinates = []
ycoordinates = []    
for a in coordinates_to_plot:
    xcoordinates.append(a[0])
    ycoordinates.append(a[1])    
plt.plot([xcoordinates],[ycoordinates],"o")
plt.show()

注意:您必须为此代码安装 matplotlibitertools 库。

代码说明:

def centroids(prev_centroid,y])       
    return centroids(prev_centroid + centroid_list,accuracy-1)

这是程序最重要的功能,它需要2个列表(prev_centroidcoordinates)和一个整数(accuracy)。它使用所有坐标来计算它们各自的质心,并将所有坐标附加到名为 centroid_list 的列表中。然后它再次调用函数 centroids() 递归 并将 accuracy 调用为 previous_accuracy_minus_1,将 prev_centroid 调用为 prev_centroid + centroid_listcoordinates centroid_list 因为我们希望将这些质心坐标作为下一次质心计算的初始坐标。此外,我们在这个函数中设置了条件,如果 accuracy 变为 0,那么该函数基本上停止。