用分散的点创建一个循环

时间:2014-05-30 07:15:22

标签: python algorithm python-3.x

我知道这听起来微不足道,但我的头脑却拒绝为此提供算法。

我有一堆分散在二维平面上的点,并希望将它们存储在一个列表中,以便它们创建一个环。这些点不属于循环。

enter image description here

从列表中的第一个点开始(此图中为红色),然后根据距离依次添加其余点。

由于我无法回答我的问题,我将在此处发布可能的答案。

这是一种似乎可以完成这项工作的方法。 V.pos保持节点的位置,而distance()只是返回两点之间的欧几里德距离的函数。更快的方法也会在将next_node附加到环之后删除它,这样您就不必通过已经连接的点

ring = [nodes[0]] while len(ring) < len(nodes): minl=99999 for i in range(len(nodes)): dist = distance(V.pos[ring[-1]],V.pos[nodes[i]]) if dist<minl and nodes[i] not in ring: minl = dist next_node = nodes[i] ring.append(next_node)

1 个答案:

答案 0 :(得分:2)

如果您的点云已经像您的示例一样呈环状,那么这个想法会给出好的结果:

  • 确定中心点;这可以是所有点的重心或边界框的中心。
  • 以参考中心
  • 表示径向坐标(半径,角度)中的所有点
  • 按角度排序

当然,这会产生随机云的锯齿状星星,但目前尚不清楚,究竟是什么?&#34; ring&#34;是。您可以将其用作初稿并开始交换节点,如果这样可以缩短总距离。也许这个简单的代码只需要在图形的所有节点上实现最小距离。

Anayway,这里是:

import math

points = [(0, 4), (2, 2), ...]     # original points in Cartesian coords    
radial = []                        # list of tuples(index, angle)

# find centre point (centre of gravity)
x0, y0 = 0, 0
for x, y in points:
    x0 += x
    y0 += y

x0 = 1.0 * x0 / len(points)
y0 = 1.0 * y0 / len(points)

# calculate angles
for i, p in enumerate(points):
    x, y = p
    phi = math.atan2(y - y0, x - x0)

    radial += [(i, phi)]

# sort by angle
def rsort(a, b):
    """Sorting criterion for angles"""
    return cmp(a[1], b[1])

radial.sort(rsort)

# extract indices
ring = [a[0] for a in radial]