点之间的角度?

时间:2011-02-25 20:41:38

标签: python algorithm math

我有一个三角形(A,B,C),我试图找到这三个点之间的角度。

问题是我可以在网上找到的算法用于确定矢量之间的角度。使用向量,我将计算从(0,0)到我所拥有的点的向量之间的角度,并且不会给出三角形内的角度。

好的,这是在维基百科页面上的方法之后和减去值之后的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,所以我做错了什么?

5 个答案:

答案 0 :(得分:37)

这里有两个错误。

  • 从弧度转换为度数时,你错过了π因子(它是×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

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

对不起,我们在你需要的时候开车送你离开了。

答案 1 :(得分:4)

我会使用law of cosines,因为您可以轻松计算三角形每边的长度,然后分别求解每个角度。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

假设你想要角度为A.那么你需要找到从A到B的矢量和从A到C的矢量之间的角度。从A到B的矢量就是B-A。 (减去坐标。)

答案 4 :(得分:0)

创建三个向量,一个从v2到v1(v2-v1),一个从v3到v1(v3-v1),一个从v3到v2(v3-v2)。一旦你有了这三个向量,就可以使用你已经找到的算法以及所有角度都增加到180度的事实。