Greiner-Hormann 剪裁与退化

Posted

技术标签:

【中文标题】Greiner-Hormann 剪裁与退化【英文标题】:Greiner-Hormann clipping with degeneracies 【发布时间】:2014-06-18 05:49:30 【问题描述】:

我试图理解 E. L Foster 和 JR Overfelt [1] 的论文“Clipping of Arbitrary Polygons with Degeneracies”,该论文声称通过处理退化扩展了经典的 Greiner-Hormann 多边形裁剪算法。

但是,我在他们描述的过程中遇到了一些困难。考虑图 6(c) 中描述的情况,并假设多边形以相同的方式定向。从 I5 开始标记阶段(与 I1 相反,就像他们所做的那样):对于主题多边形 S 和剪切多边形 C,I5 具有上一个和下一个标签(打开,打开)。因此,根据表1,首先去除交叉标志(1),然后将当前和邻居节点标记为“in/in”(2)。这与示例一致。接下来,I6 对 S 有 (in/out),对 C 有 (in/on)。表 1 显示“en/en”(或“ex/ex”,不清楚“prev”适用于列还是行)。然后,表 2 说,删除交集“en/en”和标签“in”(大概是“in/in”)[2]。但该示例声明“ex/en”,而不是“in/in”。

请问,谁能解释一下为什么会这样?如何到达“ex/en”?从哪里开始标记阶段真的很重要吗?

[1]https://github.com/erichlf/PolyClipping/blob/master/Paper/PolyClip.pdf [2] 他们还说“进入/退出标志设置为等于前一个节点的进入/退出标志”,幸运的是,这也恰好是“进入/进入”,但表 2 之间的关系不是很清楚遵守这条规则。

【问题讨论】:

【参考方案1】:

看来这是论文中的一个错误。基于表 1 的标签将首先给出 ex/ex,然后基于表 2 将产生 out/out。我们 in->on 甚至 ex->on 的情况比论文中的解释更复杂。

如果交叉点在 -> 上检查邻居,如果邻居不在 -> 上,则将当前标记为与邻居相反。所以在 I6 的情况下,我们会将其标记为 ex/en。现在,如果我们遇到邻居和当前都在->打开的情况,我们将要检查序列中的下一个点,即 I2 和 S2。如果序列中的两个点都打开,则删除此交点并将标签标记为 (in,in)。否则,如果下一个点在里面,标签应该是 en,如果下一个点在外面,标签应该是 ex。

我们从 out->on 开始的情况正好相反。

我希望这能回答你的问题。

【讨论】:

您能否扩展您对整体算法的理解。在 Forster 论文中,没有像 Greiner 原始论文中那样包含明确步骤的伪代码。到目前为止,我认为首先遍历主题和剪辑中的 所有顶点 纯粹是为了设置一个输入/输出/打开标签(这是它自己的标志属性,具有 3 个可能的值吗?)。之后只遍历 subj,对于每个 intersection 在决定如何设置进入/退出标志时测试 prev 和 next 的 in/on/out 属性。什么时候检查邻居? @user22698 你也可以分享你的理解吗?

以上是关于Greiner-Hormann 剪裁与退化的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core剪裁器升级瘦身引擎,并支持剪裁计划的录制和回放

Three.js - 立方体和球体与平面奇怪地剪裁

.NET Core剪裁器Zack.DotNetTrimmer升级瘦身引擎,并支持剪裁计划的录制和回放

Android 拍照图片选取与图片剪裁

解读Unity中的CG编写Shader系列3——表面剔除与剪裁模式

基于matlab的退化图像复原------图像退化处理