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

带孔的多边形三角剖分

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

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

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

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

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

什么是伟大的'三角'图书馆的最佳替代品,但有许可证?

===============>>#1 票数:18 已采纳

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

我们的流程如下:

  1. 使用带NonZero绕组的接头通过Clipper运行所有孔(这意味着内孔的缠绕方向与外部孔相反)。 Clipper还保证了良好的干净输入点,epsilon中没有重复。
  2. 将我们的孔过滤成逆时针和顺时针缠绕的孔。 顺时针孔意味着孔是迂回的,并且内部还有另一个需要进行三角测量的同心区域
  3. 使用poly2tri,对外部边界和每个顺时针多边形进行三角测量,使用其余的孔作为poly2tri的输入,如果在其中一个边界内找到它们的话。

结果: poly2tri似乎与Triangle一样快三角形,并且到目前为止我们已经抛出的所有内容都非常强大。

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

更新

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

===============>>#2 票数:1

您可以查看CGAL的2D Triangulations包。 这里给出用孔对具有孔的多边形进行三角测量的示例。 该软件包的许可证是GPLv3 +。

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

===============>>#3 票数:1

作为一个小旁注:

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

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

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

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

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

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

希望这可以帮助。

  ask by raptor translate from so

未解决问题?本站智能推荐:

2回复

3D C ++任意网格三角剖分库? [关闭]

我正在寻找一个C ++库来对任意3D网格进行三角测量。 优选地是开源的,但至少是免费的商业用途(因此CGAL几乎是不可能的)。 我查看了GTS ,但它是用C语言编写的(C与C ++兼容吗?),它是旧的,二进制文件是用于Debian平台的(我需要Windows二进制文件或可以在VC ++
5回复

多边形的三角剖分

我试图对多边形进行三角测量,以便在3d模型中使用。 当我尝试在多边形上使用耳朵方法,点下面点,我得到红线所在的三角形。 由于这些三角形内没有其他点,这可能是正确的。 但我希望它只对黑线内的区域进行三角测量。 任何人都知道会有这样做的算法吗?
2回复

如何在C ++中正确地对多边形进行三角剖分

我正在对一个对象进行三角测量(最终,我想实现一个Delaunay三角测量,但是三角测量甚至在合法化边缘之前也不起作用,所以我想首先关注一个简​​单的三角测量)。 我在下面列出了相关代码。 我正在实施类似于Mark de Berg的“Computation Geometry:Algorithm
1回复

当给定的定位点是三角形的顶点之一时,OpenCV的Subdiv2D / Delaunay是否断开?

用于构建三角剖分的代码: 之后,使用以下几点之一进行查询: 得到结果后,必须检查该点是否落在: 方面 边缘 顶点 在定义的三角剖分/矩形之外 在这种情况下,它是一个顶点: 但是,我的两种方法都失败了。 在前三行中,我尝试查看lo
3回复

不同平面上多边形之间的三角剖分

我想在两组多边形之间进行三角测量。 一组总是在另一组内,事实上,外多边形被创建为原始集的偏移。 如果它们在同一平面上,三角测量将很容易,但我想通过将外多边形移动到平行但不同的平面来增加深度。 我使用的常用三角测量方法(glu tesselator)不起作用。 会有替代方案吗?
2回复

Kallmann动态约束Delaunay三角剖分算法的实现[关闭]

有没有人知道Kallmann的DCDT算法的任何开源实现(最好是在java中)? 如果已经实现了另一个DCDT算法,那么它也可以工作。 我不确定是否应该在这里或在CSTheory StackExchange上发布,所以如果这是错误的发布地点,请告诉我。 编辑:这是算法: http :
2回复

使用单调多边形的多边形三角剖分

我有一个没有孔的简单多边形,它需要被三角化成凸多边形以用于物理引擎,所以我也可以使用这些凸多边形通过三角形条带进行渲染。 这篇维基百科文章展示了单调多边形如何用于对多边形进行三角测量。 它提供了它如何工作的简短描述,但没有足够的细节供我理解。 这种方法看起来非常适合我需要的东西,它链接
1回复

使用CGAL :: Constrained_Delaunay_triangulation_2对多边形进行三角剖分

我正在尝试使用CGAL的约束Delaunay三角剖分对2D多边形进行三角剖分。 但是程序正在解决此运行时错误: 〜what():CGAL错误:违反前提条件! 表达式:vaa!= vbb文件:/usr/include/CGAL/Constrained_triangulation_2.h行
3回复

OpenCV,C ++:Delaunay三角剖分中缺少三角形

我在Ubuntu 11.04上使用NetBeans 7.1,并希望使用OpenCV从一组点中获取三角形。 我按照以下步骤构建Delaunay三角剖分。 FindTriangleFromEdge()具有以下形式。 这使我获得了大多数三角形,但其中一些丢失了。 例如,我设置了一组
2回复

我如何做简单多边形的delaunay三角剖分并发现它是cgal中任何三角形的邻居

我该如何使用CGAl,多边形的Delaunay三角剖分(无孔且按cw顺序简单)并获取从Delaunay三角剖分生成的任何三角形的三角形邻居列表?