圆形 - 多边形交叉点

时间:2012-01-23 07:59:13

标签: python algorithm fortran computational-geometry

计算几何问题:
P0在多边形的边(例如EB)上随机选择(例如,BCDE),以在其他点上找到可能的点(即P1,P2,P3,...)基于给定距离的边(即r)。以下演示通过查找以点P0为中心的圆与多边形边之间的交点来显示解决方案。所以问题基本上可以通过Circle--Line-Segment交叉点分析来解决。

我想知道在计算成本方面这个非常简单的问题是否有更有效的方法?该过程将评估几个million times,因此任何改进都是有意义的。

  • 最终解决方案将受益于 Python 电源;
  • 如果需要,核心计算将在 Fortran

enter image description here

更新
感谢您的意见。请考虑我对评论的评论,这有助于更多地澄清问题。不愿意在这里重复,鼓励考虑所有的评论和答案;)。

我刚刚根据找到的[here]算法实现了Circle--Line-Segment Intersection的方法。实际上我改编它用于线段。 Python中实现的算法基准如下:
enter image description here
enter image description here
线段的数量为:100,000,系统通常是桌面。经过的时间是:15 seconds。希望这些有助于对计算成本有所了解。在 Fortan 中实施核心可以显着提高性能 然而,翻译是最后一步。

2 个答案:

答案 0 :(得分:2)

对于line(或line-segment)与circlesphere中的3D)之间的交集,有更多解释,实施细节以及 Python,C [this link]中的示例代码。您可以尝试使用它们来解决问题 这个想法基本上与您在[here]中找到的相同。

答案 1 :(得分:0)

假设circle--line-intersection已经过优化,您可以通过区分不同情况获得一些东西:

表示A,B:

  • 如果d(P0,A)< r和d(P0,B)&lt; r:没有交叉点

  • 如果d(P0,A)== r:A处的交叉点

  • 如果d(P0,B)== r:B处的交叉点
  • 如果d(P0,A)< r和d(P0,B)> r:1交叉点,执行circle--line-intersection
  • 如果d(P0,A)> r和d(P0,B)&lt; r:1个十字路口,执行circle--line-intersection

  • 如果d(P0,A)> r和d(P0,B)> r:有0,1或2个交叉点 - &GT;如果minimum distance到行(A,B)&gt; r:没有十字路口 - &GT;如果minimum distance到行(A,B)== r:1的交点 - &GT;如果minimum distance到行(A,B)&lt; r:2个交叉点