algorithm - 检测 2 种不同的多边形自相交情况(相交发生在内部或外部)

标签 algorithm geometry polygon

我正在编写一种算法,将复杂的(自相交的)多边形拆分为一个或多个简单的多边形,以便它们可以用于我的碰撞检测算法。这可以通过添加/删除顶点和创建新的多边形来完成。

为此,我检测多边形中的所有线段交点并按较低的交点 x 对它们进行排序,然后按顺序处理每个线段交点。但是,可能会发生两种类型的交集,我需要根据发生的类型以不同方式拆分多边形。这是两种可能情况的说明:

enter image description here

我已经知道我应该如何处理每种交集类型,但我不知道如何检测给定的交集是否对应于情况 1 或情况 2。有没有办法确定这一点?我拥有我的算法所需的所有信息(顶点及其顺序、交点和导致它们的线段,...)。

假设线段(P_i, P_i+1)和(P_j, P_j+1)在Q点有交点,j>i。

案例 1: 我将多边形拆分为 2 个多边形,[Q, P_i+1, ..., P_j , Q] 和 [Q, P_j+1, ..., P_i,问].

情况 2: 我在多边形中插入一个顶点 V,得到的多边形为 [P1, ..., P_i, V, P_i+1, ..., P_j, Q, P_j+1, ..., P1]

所以我需要的缺失信息是弄清楚 [Q, P_i+1, ..., P_j] 形成的循环是“外部”循环(情况 1)还是“内部”循环(案例 2).

我已经阅读了有关由循环形成的多边形的有符号区域的内容,但并不完全理解。我不是在寻找最有效的算法,只是在寻找一种可行的算法。谢谢!

最佳答案

如果在交叉点将复杂的多边形拆分为简单的多边形;然后:

  • 情况 1:简单多边形不重叠

  • 情况 2:简单多边形重叠,其中一个简单多边形实际上是“反多边形”(描述要排除的内容而不描述要包含的内容)。

这种差异可以通过“一个多边形中的所有顶点都在另一个多边形内或接触另一个多边形”测试来确定。

请注意,对于情况 2,您可以将一个多边形插入到另一个多边形中,最终得到一个简单的多边形(例如,对于您的图表,您最终会得到“P1,交叉点,P3,P2,交叉点, P4、P5、P6”)。

但是,您还忽略了更多情况。例如,从您的第二个图表(对于案例 2)开始,向上拖动 P3 使其位于从 P6 到 P1 的直线上方(导致涉及 P3 的两条边的部分两侧没有多边形)。再举一个例子,考虑一个有六个顶点的“图 8”,中间有两条相同的边(可以通过删除两条中间边将其转换为一个简单的矩形)。

为了更有趣,考虑这样的事情(但没有外圈):

https://quiabsurdum.com/wp-content/uploads/2016/11/Twelve-pointed-pentagram.png

大多数情况下,让它在所有可能的情况下都正确工作的机会为零;唯一理智的解决方法是预防(找到一种方法来防止需要处理复杂的多边形)。

关于algorithm - 检测 2 种不同的多边形自相交情况(相交发生在内部或外部),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54047675/

相关文章:

javascript - Three.js - 关于(使用)THREE.BufferGeometry 的问题

geometry - (可能是无界的)凸多边形与半平面的交集

matlab - 用某种颜色填充多边形

c - C 的 Mandelbrot 递归函数

c++ - 在具有后缀树的 LZ77/LZSS 上匹配重叠前瞻

algorithm - 是否有一种有效的算法来生成平面中一般位置的随机点?

python - 使用Python计算使用五个点的唯一圆锥截面

geometry - 自相交/复杂多边形中的点

algorithm - 欧拉计划问题 #78 的提示

python - 标准化范围 (0.0, 1.0) 中的列表数据