点之间的角度?
我有一个三角形(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
点积中的负号出现是因为我们想要得到内角。
很抱歉在你需要帮助的时候,我们关闭了这个问题,让你感到失望。