我知道这听起来微不足道,但我的头脑却拒绝为此提供算法。
我有一堆分散在二维平面上的点,并希望将它们存储在一个列表中,以便它们创建一个环。这些点不属于循环。
从列表中的第一个点开始(此图中为红色),然后根据距离依次添加其余点。
由于我无法回答我的问题,我将在此处发布可能的答案。
这是一种似乎可以完成这项工作的方法。 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)
答案 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]