首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我想从一个点列表中创建相对于一个点的标题,这些点之间有角度。有没有这样的函数呢?

我想从一个点列表中创建相对于一个点的标题,这些点之间有角度。有没有这样的函数呢?
EN

Stack Overflow用户
提问于 2013-04-24 06:57:14
回答 2查看 122关注 0票数 4

我有一个点的列表,以及它们从一个中心点相对于其他点的角度。由于列表的生成方式,列表没有顺序,也不能保证两点之间的角度是否存在。也没有办法保证角度是顺时针还是逆时针。

嵌套列表或二维numpy数组将如下所示:

代码语言:javascript
运行
复制
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]

它是从一堆点创建的,就像这样(对不起,糟糕的手机图片和工程师抓取):

我想以下面这样的列表结束:

代码语言:javascript
运行
复制
direction_list = 
[[A,0]
[B,32]
[C,69]
[D,117]
[E,173]
[F,257]]

其中本例中的“列”是Point, heading relative to point A

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-24 09:32:45

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

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

代码语言:javascript
运行
复制
graph = {'A': [('B', 32), ('D', 117)],
         'B': [('C', 37)],
         'C': [('D', 48)],
         'D': [('E', 56)],
         'E': [('F', 84)],
         'F': [('A', 103)]}

然后,我们执行有效的广度优先搜索,在找到边时添加边。请注意,这不会进行任何错误检查;任何未连接的图都将使用KeyError崩溃。然而,错误检查应该不难添加:

代码语言:javascript
运行
复制
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])

测试:

代码语言:javascript
运行
复制
if __name__ == '__main__':
    dist = calculate_distances(graph ,'A')
    print(dist)

>>> [['A', 0], ['B', 32], ['C', 69], ['D', 117], ['E', 173], ['F', 257]]
票数 2
EN

Stack Overflow用户

发布于 2013-04-24 09:28:14

这是一个图形问题。

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

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

从一个绝对角度设置为零的随机节点开始。在向下遍历一条边时,将与该边关联的角度添加到当前的绝对角度。在向上方向,减去边的角度。访问节点后,标记该节点,不要再访问该节点。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16180534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档