具有许可许可证的强大,快速复杂的多边形(带孔)三角剖分c / c ++库

时间:2013-04-16 17:03:41

标签: c++ c open-source triangulation

我是开源游戏Bitfighter的开发者。根据以下SO帖子,我们使用优秀的“三角”库进行网格区生成,以便与我们的游戏内AI(机器人)一起使用:

Polygon Triangulation with Holes

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

我们对“三角”图书馆的表现非常满意,并不想真的放弃它;但是,我们也不喜欢处理许可证问题。因此,我们已经着手寻找一个合适的,允许使用的许可替代品,它可以在稳健性和速度方面与“三角形”相匹配。

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

我找到了poly2tri,但它遇到了一个错误,它无法处理重合边的多边形。

我们已经找到了几个库,但似乎都有一个或另一个问题:要么太慢,要么不处理漏洞,或者遇到一些错误。目前我们正在测试polypartition,我们寄予厚望。

伟大的“三角”图书馆的最佳替代方案是什么,但拥有许可许可?

3 个答案:

答案 0 :(得分:17)

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

我们的流程如下:

  1. 使用带有NonZero绕组的接头在Clipper中运行所有孔(这意味着内孔与外部孔的方向相反)。 Clipper还保证在epsilon中没有重复的干净输入点。
  2. 将我们的孔过滤成逆时针和顺时针缠绕的孔。顺时针孔意味着孔是迂回的,并且内部还有另一个需要进行三角测量的同心区域
  3. 使用poly2tri,对外部边界和每个顺时针多边形进行三角测量,使用其余的孔作为poly2tri的输入,如果在其中一个边界内找到它们的话。
  4. 结果: poly2tri似乎与Triangle一样快三角形,并且到目前为止我们已经抛出的所有内容都非常强大。

    对于那些感兴趣的人,here are our code changes

    <强>更新

    我试图将我们的clipper-to-poly2tri代码与我们的健壮性添加一起提取到一个单独的库中,我从这里开始:clip2tri

答案 1 :(得分:1)

您可以查看CGAL的2D Triangulations包。给出带孔的多边形三角形的示例here。 该软件包的许可证是GPLv3 +。

请注意,如果需要,只提取此包不应该太难。

答案 2 :(得分:1)

作为一个小小的注释:

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

虽然我对Vatti限幅器结果感到满意,但poly2tri中使用的Delaunay三角测量太重,无法沿着墙面的重心坐标平滑地拖动窗框。抓了一下我的头后,我最终欺骗了这个更简单的三角形来处理洞:

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

我所做的是通过最短剪裁多边形的高度水平细分墙面。在我的情况下,它们总是矩形,但它们不是必须的。无论如何,它迫使限幅器只能使用常规或凹形多边形,因此可以让您使用更便宜的三角测量方法。

以下是一些显示正常工作的屏幕截图:

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

希望这有帮助。