我已经编写了工作代码计算相邻飞机之间的角度。
这是我已经尝试优化的内容:
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
中,从而加快程序。那就是我上面所做的。然后,角度计算仅是点产物的弧余弦。
您只需要最大值吗?然后不要创建列表,而是保持运行最大值,如果当前角度大于当前最大值,则您更新。