没有退化边缘的凹面多边形线裁剪

Posted

技术标签:

【中文标题】没有退化边缘的凹面多边形线裁剪【英文标题】:Concave Polygon Line Clipping without Degenerate Edges 【发布时间】:2011-04-22 09:42:21 【问题描述】:

我最近几天搜索并研究了互联网以找到适合我的问题的方法。

问题:

在没有方向的无限线上剪辑一个凹多边形(实际上是一个多边形在 3d 平面上,但我认为问题是相似的)。目前我使用 Sutherland-Hodgman,但生成的多边形有时包含由退化边缘创建的零面积部分,它也不支持包含孔的多边形。

我发现可以解决我的问题的最佳算法是 Weiler-Atherton 算法,但它用于裁剪具有顺时针边缘的多边形,我所拥有的只是一条无限线(在 3d 平面中)缺少方向信息。

问题:

是否有适合我需要的裁剪凹多边形的算法,或者有人对如何修改 Weiler-Atherton 算法以适用于这种情况有建议吗?有网页表明它可以推广以支持更多案例,但我无法弄清楚。

//问候 艾肯

【问题讨论】:

【参考方案1】:

在 Graphic Gems V 中找到了一个合适的算法来解决我的问题。如果有人有同样的问题,这是参考:

Glassner, A.,''Clipping a Concave Polygon'',载于 Graphics Gems V,A. Paeth 编辑,学术出版社,剑桥,1995 年

【讨论】:

【参考方案2】:

您可以使用多边形剪裁器* 通过将线条转换为剪裁多边形来解决此问题。假设您没有在接近水平的平面上进行裁剪,只需确保裁剪多边形的关键(裁剪)边缘略大于主题多边形的垂直尺寸(即边缘在主题多边形的上方和下方延伸)。如果在接近水平的平面上剪裁,请确保关键边缘比主体稍宽。

*例如 Clipper - http://sourceforge.net/projects/polyclipping/

披露:我是 Clipper 的作者,因此可能存在个人偏见。

【讨论】:

是的,我试图找出一个好方法来做到这一点。我的多边形位于 3d 空间中,因此很难决定如何将线转换为合适的多边形,因为主题多边形可能会奇怪地旋转,这使得很难确定从线(我从平面/平面交叉点得到的方向)到哪个方向展开多边形。 我想你可以在二维空间中定义剪切线。如果其绝对斜率小于 1(即接近水平),则剪裁线段(以及剪裁多边形的一个边缘)需要刚好超出主题多边形的左右范围。其他边可以轴对齐,只要确保水平边高于(或低于)主题多边形的范围。同样,如果剪裁线的绝对斜率大于 1,则使用相同的逻辑,但将其旋转 90 度。 是的,它的原理与我在 Graphic Gems V 中找到的算法基本相同,只是它更简化了我想要做的事情,我可以跳过将我的飞机表示为的步骤一条线。还是谢谢你的回答。 *** 是一个了不起的资源。

以上是关于没有退化边缘的凹面多边形线裁剪的主要内容,如果未能解决你的问题,请参考以下文章

WebGIS裁剪算法-线裁剪多边形

Unity Shader 卡通渲染 基于退化四边形的实时描边

如何从 SCNVector3 在 SceneKit 中生成凹面或凸面多边形平面

Android中的文档多边形检测和裁剪

Greiner-Hormann 剪裁与退化

Three.JS 线框材质 - 所有多边形与仅边缘