鲁棒,快速复杂多边形(带孔)三角测量c/c++库与许可许可

Robust, fast complex polygon (with holes) triangulation c/c++ library with permissive license

本文关键字:许可 测量 三角 c++ 复杂 多边形 带孔 鲁棒      更新时间:2023-10-16

我是开源游戏Bitfighter的开发者。根据以下SO帖子,我们使用了优秀的"三角形"库用于网格区域生成,用于我们的游戏内AI(机器人):

带孔的多边形三角剖分

然而,当我们想要为Debian打包我们的游戏时,我们遇到了一个小障碍-使用'Triangle'库会使我们的游戏被认为是'非自由'。

我们对'Triangle'库的性能非常满意,并不想放弃它;然而,我们也不喜欢处理许可问题。因此,我们已经开始寻找一个合适的,允许许可的替代品,可以匹配'Triangle'的健壮性和速度。

我们正在寻找一个C或c++库,可以将大的、复杂的区域划分为三角形,可以处理以任何方式放置在一起的任何类型的不规则多边形,以及孔。鲁棒性是我们的首要需求,速度几乎同样重要。

我已经找到了poly2tri,但是它有一个bug,它不能处理有重合边的多边形。

我们找到了几个库,但似乎都有这样或那样的问题:要么太慢,要么不处理漏洞,要么有一些bug。目前我们正在测试多分区,我们有很高的期望。

什么是伟大的"三角"库的最佳替代品,但有一个宽松的许可证?

我找到了一个解决方案。毕竟它是poly2tri,使用了优秀的Clipper库,并在输入中添加了一些小的算法。

我们的流程如下:

  1. 使用非零缠绕的并集将我们所有的孔穿过Clipper(这意味着内孔与外孔的缠绕方向相反)。Clipper还保证了整洁的输入点,在epsilon内没有重复。
  2. 将我们的孔过滤成逆时针和顺时针缠绕的孔。顺时针方向的洞意味着洞是圆形的,里面还有另一个同心圆区域需要三角测量
  3. 使用poly2tri,对外部边界和每个发现的顺时针多边形进行三角测量,如果在其中一个边界内发现,则使用其余孔作为poly2tri的输入。

结果: poly2tri似乎和Triangle一样快,到目前为止,我们给它的任何东西都非常健壮。

对于感兴趣的人,这里是我们的代码更改。

我已经尝试将我们的clipper-to-poly2tri代码与我们的健壮性添加一起拉到我在这里开始的一个单独的库中:clip2tri

您可以查看CGAL的2D triangulation包。这里给出了一个对带孔多边形进行三角剖分的例子。软件包的许可证为GPLv3+。

注意,如果需要的话,只提取这个包应该不会太难。

作为一个小边注:

我最近不得不实现一个复杂的多边形裁剪器&用于将窗框切割成房屋墙壁的三角测量仪。

虽然我对Vatti clipper的结果很满意,但poly2tri中使用的Delaunay三角测量太重了,无法沿着墙面的质心坐标平滑拖动窗框。在挠头之后,我最终让这个更简单的三角形与孔一起工作:

http://wiki.unity3d.com/index.php?title=Triangulator

我所做的是通过最短剪辑多边形的高度水平细分墙面。在我的例子中,它们总是矩形,但它们不必是矩形。无论如何,它迫使裁剪器只能处理规则多边形或凹多边形,从而使您能够使用更便宜的三角剖分方法。

下面是一些显示它工作的截图:

https://www.dropbox.com/sh/zbzpvlkwj8b9gl3/sIBYCqa8ak