两段之间的角度小于180(线)

OHT*_*HTO 2 python geometry computational-geometry python-2.7 shapely

我需要找到两个段(线)之间的"内部"角度,小于180度.有什么快速的方法在python2.7中做到这一点?(Shapely似乎没有这个功能)

segment1是x1,y1,x2,y2

segment2是x3,y3,x4,y4

在此输入图像描述

Gar*_*ees 5

我最初建议使用矢量形式的余弦定律:如果你的两个线段由矢量bc给出,并且它们之间的角度是θ,那么

b · c = | b | | c | cosθ

所以

θ= 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
Run Code Online (Sandbox Code Playgroud)

这是一万分之一的相对错误.对于非常小的角度,您可以获得100%的相对误差:

>>> theta = 1e-9
>>> a = Vector(1, 0)
>>> b = Vector(cos(theta), sin(theta))
>>> acos(a.dot(b) / (a.length * b.length))
0.0
Run Code Online (Sandbox Code Playgroud)

替代公式使用反正切而不是反余弦:

θ= tan -1(| a × b | /(a · b))

这为小角度提供了更准确的结果:

>>> atan2(abs(a.cross(b)), a.dot(b))
1e-09
>>> theta == _
True
Run Code Online (Sandbox Code Playgroud)

(替代公式来自叉积性质 | a  ×  b | = | a | | b |sinθ.用余弦定律除以此得到的结果.)

  • 逆cos是计算机程序的条件,正确的解决方案使用atan2()完成此任务,并处理特殊情况,如除以0 (3认同)