检查多边形是否为自相交

时间:2011-02-02 15:10:28

标签: c# .net geometry shapes polygons

我有一个System.Windows.Shapes.Polygon对象,其布局完全由一系列点确定。我需要确定这个Polygon是否是自相交的;即,如果多边形的任何边与非顶点的点处的任何其他边相交。是否有一种简单/快速的方法来计算它?

4 个答案:

答案 0 :(得分:28)

  • 简单,缓慢,内存占用率低:将每个细分与其他细分相比较并检查交叉点。复杂性 O(n 2

  • 稍快,中等内存占用(上面的修改版本):在空间“存储桶”中存储边缘,然后在每个存储桶的基础上执行上述算法。 m 桶的复杂度 O(n 2 / m)(假设均匀分布)。

  • 快速&高内存占用:使用空间哈希函数将边分割成桶。检查碰撞。复杂性 O(n)

  • 快速&低内存占用:使用扫描线算法,例如here(或here)描述的算法。复杂性 O(n log n)

最后一个是我最喜欢的,因为它具有良好的速度 - 内存平衡,尤其是Bentley-Ottmann algorithm。实施也不太复杂。

答案 1 :(得分:3)

检查是否有任何非连续的线段相交。

答案 2 :(得分:2)

为了完整起见,我在本次讨论中添加了另一种算法。

假设读者知道轴对齐的边界框(如果不是谷歌的话)。使用“扫描和修剪算法”快速找到具有AABB碰撞的边缘对可能非常有效。 (谷歌一下)。然后在这些对上调用交叉例程。

这里的优势在于您甚至可以与非直边(圆形和样条线)相交,并且方法更加通用,尽管几乎同样有效。

答案 3 :(得分:0)

我是这里的新蜜蜂,这个问题已经足够老了。但是,这是我的Java代码,用于确定由有序点集定义的多边形的任意一对边是否交叉。您可以删除用于调试的打印语句。我还没有包含返回找到的交叉点的代码。

grep -a '2' text.txt