我想从点的列表中创建相对于单个点的标题。这有功能吗?

时间:2013-04-23 22:57:14

标签: python numpy

我从一个中心点得到了一个点和它们相对于彼此的角度列表。由于列表的生成方式,列表没有顺序,也不保证两点之间的角度是否存在。也无法保证角度是顺时针或逆时针。

嵌套列表或2D 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]

这是从像这样的一组点创建的(抱歉蹩脚的手机图片和工程师抓挠):

Crappy drawing of what I am trying to find

我希望得到一个像这样的列表:

direction_list = 
[[A,0]
[B,32]
[C,69]
[D,117]
[E,173]
[F,257]]

此案例中的“列”为Point, heading relative to point A

这只是一个例子,A点不一定是标题点,它可以是集群中的任何一点。

是否有一个numpy或python函数会循环遍历列表并根据列表中的常用值创建一个新的值列表,我可以在这种情况下使用它?

2 个答案:

答案 0 :(得分:2)

这是一个图形问题。

原始列表中的每一对都可以被视为边缘。

从此列表构建图表,然后运行深度优先搜索。

从一个随机节点开始,绝对角度设置为零。沿向下方向移动边时,将与该边关联的角度添加到当前绝对角度。在向上方向上,减去边缘的角度。访问过某个节点后,请对其进行标记,然后再不再访问该节点。

如果图形已连接,则此过程应将绝对角度与每个节点相关联。否则,您将不得不尝试在图中的每个节点重新启动DFS,以获得断开的绝对角度集。

如果某些绝对角度为负,则只从整个绝对角度列表中减去最小角度。

答案 1 :(得分:2)

这可以成为图论问题:给定节点和边的列表,根据边加上从起始节点到当前边的距离计算它们之间的距离。可以通过使图表定向来编码方向。

在上面的示例中,假设您想要以顺时针方向旋转(我假设这是因为AF之间的角度是257,而不是103)。因此,在此方向中,AF之间没有边缘。我们可以按如下方式对图形进行编码:

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]]