【问题标题】:How do I recursively plot centroids of a given set of points?如何递归绘制给定点集的质心?
【发布时间】:2021-04-26 04:59:58
【问题描述】:

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

但是,我不知道我应该使用 python 中的哪些库或如何使用,或者即使 python 是这类东西的最佳语言。如果它更适合目的,我愿意学习任何其他语言。

我有兴趣了解在给定不同初始点(主要是多边形的顶点)的情况下图形如何演变。

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

【问题讨论】:

  • “绘图”是指使用matplotlib(实际上是绘制三角形并绘制点)还是仅查找三角形质心的坐标?
  • 我想查看屏幕上的点。我不知道我如何从 matplotlib 中做到这一点,或者我是否可以做到。
  • 好的。另外,你能通过递归地绘制它们来解释你的意思吗?这是否意味着您想使用递归函数来实现这一目标?
  • 编辑了问题,请看。

标签: python plot drawing polygon draw


【解决方案1】:

这是用给定的准确度绘制点“递归”的代码。对于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()

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

代码说明:

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_centroidcoordinates)和一个整数(accuracy)。它使用所有坐标来计算它们各自的质心,并将所有坐标附加到名为centroid_list 的列表中。然后它再次调用函数 centroids() 递归 并调用 accuracyprevious_accuracy_minus_1prev_centroidprev_centroid + centroid_listcoordinatescentroid_list 因为我们想要这些质心坐标作为下一次质心计算的初始坐标。此外,我们在此函数中设置了条件,即如果accuracy 变为零,则函数实质上停止。

【讨论】:

  • 如果答案足够好并且符合要求,请采纳。 ?
猜你喜欢
  • 2017-04-13
  • 2020-10-19
  • 2011-02-08
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多