点之间的角度?

40 投票
6 回答
7505 浏览
提问于 2025-04-16 12:33

我有一个三角形(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,那我到底哪里出错了呢?

6 个回答

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
4

我会使用余弦定理,因为这样可以很简单地计算出三角形每一条边的长度,然后再一个一个地求出每个角的大小。

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

点积中的负号出现是因为我们想要得到内角。

很抱歉在你需要帮助的时候,我们关闭了这个问题,让你感到失望。

撰写回答