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

最佳答案

这里有两个错误。

  • 从弧度转换为度数(×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
    

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

    很抱歉,我们通过关闭问题将您赶在需要的时候。

    07-28 08:08