具有许可许可的强大、快速的复杂多边形(带孔)三角剖分 C/C++ 库 [关闭]
Posted
技术标签:
【中文标题】具有许可许可的强大、快速的复杂多边形(带孔)三角剖分 C/C++ 库 [关闭]【英文标题】:Robust, fast complex polygon (with holes) triangulation c/c++ library with permissive license [closed] 【发布时间】:2013-04-09 04:56:42 【问题描述】:我是开源游戏Bitfighter 的开发者。根据以下 SO 帖子,我们使用了出色的“三角形”库来生成网格区域,以便与我们的游戏内 AI(机器人)一起使用:
Polygon Triangulation with Holes
但是,当我们想为 Debian 打包我们的游戏时遇到了一个小障碍 - 使用“Triangle”库会使我们的游戏被视为“非免费”。
我们对“Triangle”库的性能非常满意,并不想放弃它;但是,我们也不喜欢处理许可证问题。因此,我们已着手寻找合适的、获得许可的替代品,以在稳健性和速度方面与“Triangle”相媲美。
我们正在寻找用于将大型复杂区域划分为三角形的 C 或 C++ 库,该库可以处理以任何方式放置在一起的任何类型的不规则多边形以及孔洞。稳健性是我们的首要需求,速度几乎同样重要。
我找到了poly2tri,但它存在无法处理边缘重合的多边形的错误。
我们找到了几个库,但似乎都遇到了这样或那样的问题:要么太慢,要么不处理漏洞,或者遇到一些错误。目前我们正在测试polypartition,我们寄予厚望。
什么是伟大的“三角形”库的最佳替代品,但有一个许可?
【问题讨论】:
您能否详细说明您需要从 Triangle 这样的库中获得什么?也许您可以自己编写一些算法,然后根据需要发布您的代码。 三角许可证到底是什么?您是否尝试过向 Jonathan Shewchuk 发送电子邮件,询问他是否会为您重新授权? @MareInfinitus 我们的关卡中有墙壁。需要对关卡的整个可玩区域进行三角测量以进行网格区域导航,以便我们的机器人可以移动。 @raptor 真的很难说,也许最好的办法是,就像 rob mayoff 已经推荐的那样,写信给 Triangle 的作者 有趣的是,这已被关闭为题外话,并附有“描述问题以及迄今为止为解决该问题所做的工作”的说明 【参考方案1】:我找到了解决方案。毕竟是 poly2tri,使用了出色的 Clipper 库,并在输入中添加了一些小的算法。
我们的流程如下:
-
使用带非零绕组的接头将所有孔穿过 Clipper(这意味着内孔与外孔的缠绕方向相反)。 Clipper 还保证输入点干净整洁,在 epsilon 内没有重复。
将我们的孔过滤成逆时针和顺时针缠绕的孔。顺时针孔意味着孔是迂回的,并且内部还有另一个同心区域需要进行三角测量
使用 poly2tri,对外部边界和找到的每个顺时针多边形进行三角测量,如果在边界之一内找到其余孔,则将其用作 poly2tri 的输入。
结果: poly2tri 的三角剖分速度似乎与 Triangle 一样快,并且到目前为止,我们所投入的一切都非常稳健。
对于那些感兴趣的人,here are our code changes。
更新
我试图将我们的 clipper-to-poly2tri 代码以及我们的稳健性添加提取到一个单独的库中,我从这里开始:clip2tri
【讨论】:
我想跟进并说 poly2tri 虽然速度很快,但有时确实会遇到鲁棒性问题,通常涉及在 epsilon 中非常接近的点 我使用了您描述的技术,还发现了一些 poly2tri 崩溃的实例。我能够通过这种组合解决所有情况:在 Execute() 之前设置 Clipper::StrictlySimple(true);之后,我使用 CleanPolygon(),然后将 edgeShrink() 用于生成的多边形和孔;最后,检查具有相同坐标的相邻顶点并删除其中一个(当它少于 3 个顶点时丢弃整个多边形/孔)。【参考方案2】:您可以查看 CGAL 的 2D Triangulations 包。 here 给出了一个用孔对多边形进行三角剖分的示例。 该软件包的许可证是 GPLv3+。
请注意,如果需要,仅提取此包应该不会太难。
【讨论】:
【参考方案3】:作为一个小旁注:
我最近不得不实现一个复杂的多边形剪裁器和三角剖分器,用于将窗框切割成房屋墙壁。
虽然我对 Vatti 剪裁器的结果感到满意,但 poly2tri 中使用的 Delaunay 三角剖分太重,无法沿着墙面的重心坐标平滑拖动窗框。在摸了摸头之后,我最终欺骗了这个更简单的三角形来处理孔:
http://wiki.unity3d.com/index.php?title=Triangulator
我所做的是将墙面水平细分为最短剪裁多边形的高度。在我的情况下,它们总是矩形,但它们不一定是。无论如何,它会强制限幅器仅适用于常规或凹面多边形,因此您可以使用更便宜的三角测量方法。
以下是一些显示它工作的屏幕截图:
https://www.dropbox.com/sh/zbzpvlkwj8b9gl3/sIBYCqa8ak
希望这会有所帮助。
【讨论】:
你是如何欺骗它接受漏洞的?以上是关于具有许可许可的强大、快速的复杂多边形(带孔)三角剖分 C/C++ 库 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
数学篇08 # 如何利用三角剖分和向量操作描述并处理多边形?
数学篇08 # 如何利用三角剖分和向量操作描述并处理多边形?