我需要找到两个线段(线)之间的“内”角,即小于 180 度。在python2.7中有什么快速的方法吗?(Shapely 似乎没有这个功能)
段 1 是 x1,y1,x2,y2
段 2 是 x3,y3,x4,y4
我需要找到两个线段(线)之间的“内”角,即小于 180 度。在python2.7中有什么快速的方法吗?(Shapely 似乎没有这个功能)
段 1 是 x1,y1,x2,y2
段 2 是 x3,y3,x4,y4
我最初建议使用向量形式的余弦定律:如果你的两条线段由向量b和c给出,并且它们之间的角度是 θ,那么
b · c = | 乙| | c | 系数θ
所以
θ = cos −1 (( b · c ) / | b | | c |)
但正如 Alex Wien 在评论中指出的那样,当 θ 接近于零时,结果很差:
>>> theta = 1e-6
>>> a = Vector(1, 0)
>>> b = Vector(cos(theta), sin(theta))
>>> acos(a.dot(b) / (a.length * b.length))
9.999334257726859e-07
>>> abs(theta - _) / theta
6.657422731408927e-05
这是万分之一的相对误差。对于非常小的角度,您可以获得 100% 的相对误差:
>>> theta = 1e-9
>>> a = Vector(1, 0)
>>> b = Vector(cos(theta), sin(theta))
>>> acos(a.dot(b) / (a.length * b.length))
0.0
另一个公式使用反正切而不是反余弦:
θ = tan −1 (| a × b | / ( a · b ))
对于小角度,这给出了更准确的结果:
>>> atan2(abs(a.cross(b)), a.dot(b))
1e-09
>>> theta == _
True
(替代公式来自叉积的性质| a × b | = | a | | b | sin θ。将其除以余弦定律得到此处使用的结果。)