我有一个点的列表,以及它们从一个中心点相对于其他点的角度。由于列表的生成方式,列表没有顺序,也不能保证两点之间的角度是否存在。也没有办法保证角度是顺时针还是逆时针。
嵌套列表或二维numpy数组将如下所示:
angle_array =
[[A, B, 32]
[C, B, 37]
[A, D, 117]
[F, E, 84]
[A, F, 103]
[D, E, 56]]其中列表的“列”是[Point 1, Point 2, Angle between 1 and 2]
它是从一堆点创建的,就像这样(对不起,糟糕的手机图片和工程师抓取):

我想以下面这样的列表结束:
direction_list =
[[A,0]
[B,32]
[C,69]
[D,117]
[E,173]
[F,257]]其中本例中的“列”是Point, heading relative to point A
这只是一个例子,点A不一定是头标点,它可以是簇中的任何点。
有没有一个numpy或python函数可以遍历一个列表,并根据列表中的常见值创建一个新的值列表,我可以在这种情况下使用它?
发布于 2013-04-24 09:32:45
这可以变成一个图论问题:给定一个节点和边的列表,根据边加上从起始节点到当前边的距离来计算它们之间的距离。可以通过使图形定向来对方向进行编码。
在上面的示例中,假设您希望沿顺时针方向旋转(我假设这是因为A和F之间的角度是257,而不是103)。因此,在这个方向上,A和F之间没有边。我们可以对我们的图进行如下编码:
graph = {'A': [('B', 32), ('D', 117)],
'B': [('C', 37)],
'C': [('D', 48)],
'D': [('E', 56)],
'E': [('F', 84)],
'F': [('A', 103)]}然后,我们执行有效的广度优先搜索,在找到边时添加边。请注意,这不会进行任何错误检查;任何未连接的图都将使用KeyError崩溃。然而,错误检查应该不难添加:
import queue
def calculate_distances(graph, start):
q = queue.Queue()
distances = {start: 0}
for adj in graph[start]:
distances[adj[0]] = adj[1]
q.put(adj[0])
while not q.empty():
next_node = q.get()
for adj in graph[next_node]:
if adj[0] not in distances:
distances[adj[0]] = adj[1] + distances[next_node]
q.put(adj[0])
return sorted([[x, y] for x, y in distances.items()], key=lambda x: x[0])测试:
if __name__ == '__main__':
dist = calculate_distances(graph ,'A')
print(dist)
>>> [['A', 0], ['B', 32], ['C', 69], ['D', 117], ['E', 173], ['F', 257]]发布于 2013-04-24 09:28:14
这是一个图形问题。
你的原始列表中的每一对都可以被视为一条边。
从这个列表构建一个图,然后运行深度优先搜索。
从一个绝对角度设置为零的随机节点开始。在向下遍历一条边时,将与该边关联的角度添加到当前的绝对角度。在向上方向,减去边的角度。访问节点后,标记该节点,不要再访问该节点。
如果图形是连接的,则此过程应将绝对角度关联到每个节点。否则,您必须尝试在图形中的每个节点重新启动DFS,以获得断开连接的绝对角度集。
如果某些绝对角度为负,只需从整个绝对角度列表中减去最小角度即可。
https://stackoverflow.com/questions/16180534
复制相似问题