点之间的angular度?
我有一个三angular形(A,B,C),并试图找出这三个点之间的angular度。
问题是,我可以在网上find的algorithm是确定向量之间的angular度。 使用vector,我将计算从(0,0)到我有的点的vector之间的angular度,并且不会给出三angular形内的angular度。
好的,下面是维基百科页面上的方法之后的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 /π)
-
你必须小心vector的迹象,因为它们是有针对性的线段。
如果我做这些修改,我会得到一个合理的结果:
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
点积中的负号是因为我们试图获得内部的angular度。
对不起,我们在你需要的时候把你赶走了,结束这个问题。
我会用余弦定律 ,因为你可以很容易地计算出三angular形每边的长度,然后分别求出每个angular度。
另外,如果你只知道三angular形的边长,你可以使用余弦定律 。
假设你想要angular度为A.那么你需要find从A到B的向量和从A到C的向量之间的angular度。从A到B的向量就是BA。 (减去坐标。)
创build三个向量,一个从v2到v1(v2-v1),一个从v3到v1(v3-v1),另一个从v3到v2(v3-v2)。 一旦你有这三个向量,你可以使用你已经发现的algorithm,以及所有的angular度将增加到180度的事实。