点之间的角度?

40
我有一个三角形(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,那么我做错了什么吗?


你的三角形是如何表示的?使用3对(x,y)坐标吗? - Matt Ball
@matt 是的,就像那样。 @peter 我只想要一个算法,所以你可以使用Java/C++语法或Python。我都懂。 - luct
7
这实际上是一个编程问题吗?如果是,请发布一些源代码,否则这个问题应该发布在http://math.stackexchange.com/ 上。 - Mike Atlas
3
从一个点X到另一个点Y的向量是 Y-X。 - mokus
1
B-AC-A得到两个向量。它们之间的点积给出了它们之间的夹角。 - Mahesh
显示剩余2条评论
6个回答

40

这里有两个错误。

  • 在从弧度转换为角度时,您遗漏了一个因子 π(应该是 × 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

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

很抱歉在你需要帮助的时候,通过关闭问题而将你赶走了。


你的回答被展示在http://www.embeddedrelated.com/showarticle/741.php上。:P 是的,我知道是你写的...只是说一下 :) - Sameer Alibhai
9
在我写这篇文章的时候,这个问题已经关闭了,所以我无法在这里发布答案。我投票支持重新开放该问题,其他人也同意我的看法,然后我也在这里发布了答案。 - Jason S

4
我会使用余弦定理,因为你可以轻松计算三角形的每条边长,然后分别解决每个角度。

1

只需要计算两个角度,第三个角度可以从前两个角度计算出来。

第一个角度,取两个向量B-A、C-A,对于第二个角度,取C-B、A-B。

points = np.array([[343.8998, 168.1526], [351.2377, 173.7503], [353.531, 182.72]])
A,B,C = points[0], points[1], points[2]

e1 = B-A; e2 = C-A
denom = np.linalg.norm(e1) * np.linalg.norm(e2)
d1 = np.rad2deg(np.arccos(np.dot(e1, e2)/denom))

e1 = C-B; e2 = A-B
denom = np.linalg.norm(e1) * np.linalg.norm(e2)
d2 = np.rad2deg(np.arccos(np.dot(e1, e2)/denom))

d3 = 180-d1-d2

print (d1,d2,d3)

输出结果为:
19.191300537488704 141.6798063583008 19.128893104210505

0

或者,如果您只知道三角形的边长,则可以使用余弦定理


0
假设你想要点A的角度。那么你需要找出从A指向B和从A指向C的两向量之间的夹角。从A指向B的向量就是B-A(坐标相减)。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接