如何重绘一个完全自相交的多边形?

Posted

技术标签:

【中文标题】如何重绘一个完全自相交的多边形?【英文标题】:how to redraw a polygon that completely self-intersects? 【发布时间】:2016-01-25 16:16:20 【问题描述】:

问题是重绘一个自相交的二维多边形,它的边界始终是其内部和外部之间的分隔线,并且在某些点上完全交叉(也就是说,在这些点上,多边形内部切换了边边框,从左到右,反之亦然)。

可以做到这一点的最简单算法是什么?

初始多边形(左)和重绘的多边形(右):

.

我添加了另一个更复杂的初始多边形示例,它仍然非常简单(它只有一个自相交顶点)in this third picture 填充了多边形内部(点 A、B、C、D ,E 最初在绘制多边形边框时按字母顺序出现)。

【问题讨论】:

你的意思是重绘它以使其不再自相交? 最终结果应始终使多边形内部位于其边界的同一侧。 所以它有点自我相交。 我只是认为自己这样做是一种“天真的方式”。 这似乎是为了让 SO 用户做你的功课。您为什么不展示您所做的工作,以便我们知道您正在积极解决问题? 【参考方案1】:

你问的没那么简单。

您可以使用扫描线程序。一般原则如下。

当你在多边形上画一条水平线时,它遇到偶数条边。将交叉点从左到右排序,然后成对连接,就可以得到内部线段。

如果你对水平的所有位置都这样做,你会将多边形分解成许多单调链,即多段线总是向下。

当多边形很简单时,链条在一个顶点成对出现,在另一个顶点成对消失,并过着自己的生活。但是当多边形交叉时,链可以相互交叉。这可以通过以下事实来检测:从水平位置到下一个位置,交点的顺序发生变化。

现在你必须通过“不交叉”链来解决这个问题,这是通过在交叉点处分割边缘来完成的。

我这里不能开发更多,尝试查找“扫描线算法”。

【讨论】:

谢谢。感谢您的彩色绘画和用通俗易懂的语言表达您的信息(我也是它的粉丝)。 @Yves Daoust,非常感谢。但我的问题是关于如何进行不交叉(这不是关于在初始多边形顶点列表中找到自相交并在必要的地方插入它们;所以让我们假设边缘分割已经在必要的地方完成,并且给出了带有自交点的初始顶点列表)。您现在能否进一步说明未交叉应该基于的想法,并通过将您的方法应用于我的第三张图片中的示例来举例说明?请用同样美妙的简单语言:)

以上是关于如何重绘一个完全自相交的多边形?的主要内容,如果未能解决你的问题,请参考以下文章

高效提取 MultiPolygon 中自相交特征生成的所有子多边形

如何有效地确定多边形是凸面、非凸面还是复面?

如何测试线是否与凸多边形相交?

非零缠绕规则和奇偶规则

不相交多边形中的点

如何通过 Boost C++ 库与 3D 多边形相交?