【问题标题】:angle less than 180 between two segments (lines)两段(线)之间的角度小于 180
【发布时间】:2013-10-10 12:26:28
【问题描述】:

我需要找到两条线段(线)之间的“内”角(以度为单位),即小于 180 度。 在python2.7中有什么快速的方法吗? (Shapely 好像没有这个功能)

segment1 是 x1,y1,x2,y2

segment2 是 x3,y3,x4,y4

【问题讨论】:

  • 如果你能够计算出 3 个点之间的角度,那么如果 > 180: innerAngle = 360.0 - angle;不推荐您接受的解决方案(病态 acos() ),请进一步搜索。
  • 计算两条线段夹角的通用方法is shown in this answer.

标签: python python-2.7 geometry computational-geometry shapely


【解决方案1】:

我最初建议使用向量形式的law of cosines:如果你的两条线段由向量bc给出,它们之间的角度是θ , 那么

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

等等

θ = cos−1((b · c) / |b| | c|)

但正如 Alex Wien 在 cmets 中指出的那样,当 θ 接近于零时,结果很差:

>>> 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

(替代公式来自property of the cross product,|a × b| = |a| |b|sin θ。将其除以余弦定律得到此处使用的结果。)

【讨论】:

  • 如何在 python 中编写这个 cos^-1(etc...)?
  • 好吧,您阅读了手册!反余弦等数学函数位于math 模块中。
  • 这对于计算机程序是不可用的。这与工作代码相去甚远。
  • 逆 cos 不适用于计算机程序,正确的解决方案是使用 atan2() 来完成此任务,并处理除以 0 等特殊情况
  • 我认为 acos 对于这种情况就足够了......他只需要向量之间的角度
猜你喜欢
  • 2016-09-15
  • 2021-09-28
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多