我有一个System.Windows.Shapes.Polygon对象,其布局完全由一系列点确定。我需要确定这个Polygon是否是自相交的;即,如果多边形的任何边与非顶点的点处的任何其他边相交。是否有一种简单/快速的方法来计算它?
答案 0 :(得分:28)
简单,缓慢,内存占用率低:将每个细分与其他细分相比较并检查交叉点。复杂性 O(n 2 )。
稍快,中等内存占用(上面的修改版本):在空间“存储桶”中存储边缘,然后在每个存储桶的基础上执行上述算法。 m 桶的复杂度 O(n 2 / m)(假设均匀分布)。
快速&高内存占用:使用空间哈希函数将边分割成桶。检查碰撞。复杂性 O(n)。
最后一个是我最喜欢的,因为它具有良好的速度 - 内存平衡,尤其是Bentley-Ottmann algorithm。实施也不太复杂。
答案 1 :(得分:3)
检查是否有任何非连续的线段相交。
答案 2 :(得分:2)
为了完整起见,我在本次讨论中添加了另一种算法。
假设读者知道轴对齐的边界框(如果不是谷歌的话)。使用“扫描和修剪算法”快速找到具有AABB碰撞的边缘对可能非常有效。 (谷歌一下)。然后在这些对上调用交叉例程。
这里的优势在于您甚至可以与非直边(圆形和样条线)相交,并且方法更加通用,尽管几乎同样有效。
答案 3 :(得分:0)
我是这里的新蜜蜂,这个问题已经足够老了。但是,这是我的Java代码,用于确定由有序点集定义的多边形的任意一对边是否交叉。您可以删除用于调试的打印语句。我还没有包含返回找到的交叉点的代码。
grep -a '2' text.txt