检查多边形是否为自相交

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

  • 简单,缓慢,低内存占用 :将每个分段与所有其他分段进行比较并检查交叉点。 复杂度O(n 2

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

  • 快速和高内存占用 :使用空间散列函数将边分割成桶。 检查碰撞。 复杂度O(n)

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

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

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

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

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

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