点之间的角度?

2024-10-02 22:37:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个三角形(a,B,C),我试图找出这三个点的每一对之间的角度。

问题是,我可以在网上找到的算法是用来确定矢量之间的角度。使用向量,我可以计算向量之间的角度,从(0,0)到我的点,这并没有给我三角形内部的角度。

好的,在Wikipedia页面上的方法和减去值之后,这里有一些Python代码:

import numpy as np
points = np.array([[343.8998, 168.1526], [351.2377, 173.7503], [353.531, 182.72]])

A = points[2] - points[0]
B = points[1] - points[0]
C = points[2] - points[1]

for e1, e2 in ((A, B), (A, C), (B, C)):
    num = np.dot(e1, e2)
    denom = np.linalg.norm(e1) * np.linalg.norm(e2)
    print np.arccos(num/denom) * 180

这给了我60.2912487814,60.0951900475和120.386438829,那么我做错了什么?


Tags: 算法norm矢量np页面wikipedia向量num
3条回答

我将使用law of cosines,因为您可以很容易地计算三角形每边的长度,然后分别求解每个角度。

这里有两个错误。

  • 当从弧度转换为度时,你错过了π的因子(它是×180/π)

  • 你必须小心向量的符号,因为它们是有向线段。

如果我做了这些修改,我会得到一个有意义的结果:

import numpy as np
points = np.array([[343.8998, 168.1526], [351.2377, 173.7503], [353.531, 182.72]])

A = points[2] - points[0]
B = points[1] - points[0]
C = points[2] - points[1]

angles = []
for e1, e2 in ((A, B), (A, C), (B, -C)):
    num = np.dot(e1, e2)
    denom = np.linalg.norm(e1) * np.linalg.norm(e2)
    angles.append(np.arccos(num/denom) * 180 / np.pi)
print angles
print sum(angles)

打印出来的

[19.191300537488704, 19.12889310421054, 141.67980635830079]
180.0

我可能会使事情更对称,使用循环的和为零的A,B,C向量:

import numpy as np
points = np.array([[343.8998, 168.1526], [351.2377, 173.7503], [353.531, 182.72]])

A = points[1] - points[0]
B = points[2] - points[1]
C = points[0] - points[2]

angles = []
for e1, e2 in ((A, -B), (B, -C), (C, -A)):
    num = np.dot(e1, e2)
    denom = np.linalg.norm(e1) * np.linalg.norm(e2)
    angles.append(np.arccos(num/denom) * 180 / np.pi)
print angles
print sum(angles)

打印出来的

[141.67980635830079, 19.12889310421054, 19.191300537488704]
180.0

点积中的负号是因为我们试图得到内角。

很抱歉我们在你需要的时候把你赶走了,结束了这个问题。

或者,如果只知道三角形边的长度,则可以使用Law of cosines

相关问题 更多 >