平面算法之间的角度太慢



我已经编写了工作代码计算相邻飞机之间的角度。

这是我已经尝试优化的内容:

1(我摆脱了几个NP内置功能,例如np.cross((和np.linalg.norm((,这给了我几秒钟。

2(是在范围内(1,n(的z,我更改为k,以便不考虑已经计算出的三角形。

我也试图进行更快的输入,但无济于事。

拜托,有人可以告诉我如何使其更快吗?我对图表不太了解,我对此有不好的感觉...

(迁移到代码评论(

您通过彼此匹配所有三角形来确定三角形的邻接。如果您创建一个边缘字典,则可以更有效地找到相邻的三角形。

使用边缘的两个节点作为键。为了使密钥与众不同,请将最低索引的节点成为第一个索引。阅读索引时可以创建dict:

edge = {}
for i in range(n):
    a, b, c = [int(j) for j in raw_input().split()]
    ind.append((a, b, c))
    k = (min(a, b), max(a, b))
    edge[k] = edge.get(k, []) + [i]
    k = (min(b, c), max(b, c))
    edge[k] = edge.get(k, []) + [i]
    k = (min(c, a), max(c, a))
    edge[k] = edge.get(k, []) + [i]

使用dict so:

def calculate_angle():
    for e in edge:
        if len(e) == 2:
            i1, i2 = e
            n1 = norm[i1]
            n2 = norm[i2]
            a = abs(math.acos(max(-1, min(1, dot(n1, n2)))))
            angles_list.append(a)
    return max(angles_list)

这里的缺点是角度以任意顺序出现在列表中,但这也是您原始代码中发生的事情。

您可以仅针对每个Tria的单位向量进行正常为单位矢量,然后将其存储在列表norm中,从而加快程序。那就是我上面所做的。然后,角度计算仅是点产物的弧余弦。

您只需要最大值吗?然后不要创建列表,而是保持运行最大值,如果当前角度大于当前最大值,则您更新。

最新更新