多边形 - 多边形 - 交叉在特殊情况下失败

时间:2017-07-07 12:31:12

标签: algorithm geometry polygon computational-geometry

我已经实现了Bentley-Ottmann-algorithm来检测多边形 - 多边形交叉点。这通常非常有效:由于多边形不是自相交的,因此两个多边形的线段并集中的任何线段交叉都表示两个多边形相交。

但如果我看一下这个案子: common-node-intersection

没有分段交叉点。但很明显,两个多边形相交。

如何在不使用naive算法的情况下检测此情况,该算法检查另一个多边形中每个多边形的每个点的多边形点,因此以O(m * n)运行。

1 个答案:

答案 0 :(得分:1)

<强>提示

特殊情况(如边缘上的顶点或两个重叠边缘)的处理是一个令人不安的主题,因为配置是变化的,并且情况可以伸缩(想到几个重叠的共线边缘)。

我最好的建议是通过为每个顶点分配内部或外部状态(与另一个多边形)来强制执行连贯性。然后,当您将边与另一个多边形相交时,交点数的奇偶校验必须与端点状态的变化相匹配(相同的状态=&gt;偶数个交叉点)。

我没有指定您分配状态的方式,这取决于您的特定算法(实际上状态是按照您的方式分配的)。重要的是,当一个州经过测试时,你可能不会再改变它了。

如果出现异常(交叉点数量的奇偶校验与状态变化不匹配),您必须通过牺牲交叉点或复制一个交叉点(或您认为合适的任何其他规则)来解决这个问题。

示例:

在此示例中,绿点表示蓝色多边形外部的顶点,数字表示分配给相应边的交叉点的可接受数量。

下面的黑色轮廓表示由此状态分配产生的联合多边形。

enter image description here