鲁棒,快速复杂多边形(带孔)三角测量c/c++库与许可许可
Robust, fast complex polygon (with holes) triangulation c/c++ library with permissive license
我是开源游戏Bitfighter的开发者。根据以下SO帖子,我们使用了优秀的"三角形"库用于网格区域生成,用于我们的游戏内AI(机器人):
带孔的多边形三角剖分
然而,当我们想要为Debian打包我们的游戏时,我们遇到了一个小障碍-使用'Triangle'库会使我们的游戏被认为是'非自由'。
我们对'Triangle'库的性能非常满意,并不想放弃它;然而,我们也不喜欢处理许可问题。因此,我们已经开始寻找一个合适的,允许许可的替代品,可以匹配'Triangle'的健壮性和速度。
我们正在寻找一个C或c++库,可以将大的、复杂的区域划分为三角形,可以处理以任何方式放置在一起的任何类型的不规则多边形,以及孔。鲁棒性是我们的首要需求,速度几乎同样重要。
我已经找到了poly2tri,但是它有一个bug,它不能处理有重合边的多边形。
我们找到了几个库,但似乎都有这样或那样的问题:要么太慢,要么不处理漏洞,要么有一些bug。目前我们正在测试多分区,我们有很高的期望。
什么是伟大的"三角"库的最佳替代品,但有一个宽松的许可证?
我找到了一个解决方案。毕竟它是poly2tri,使用了优秀的Clipper库,并在输入中添加了一些小的算法。
我们的流程如下:
- 使用非零缠绕的并集将我们所有的孔穿过Clipper(这意味着内孔与外孔的缠绕方向相反)。Clipper还保证了整洁的输入点,在epsilon内没有重复。
- 将我们的孔过滤成逆时针和顺时针缠绕的孔。顺时针方向的洞意味着洞是圆形的,里面还有另一个同心圆区域需要三角测量
- 使用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- 在C++中测量postscript字体宽度
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 用时钟测量程序的运行时间
- 用于测量微秒的QueryPerformanceCounter的奇怪行为
- 为什么根据测量位置测量经过的时间时会有很大的不同?
- 为什么我的程序在输入某个形状的面积的测量值后没有结束?
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- 分别测量每个线程上花费的 CPU 时间(C++)
- 如何测量管道延迟?
- 测量时间以在 c++ 中生成更好的随机数
- OpenCL 内核计时测量 0 秒或导致 SIGABRT
- 给定使用 C++ 或 C,我如何测量在 linux 下进行线程切换需要多长时间?可能吗?
- 使用 Qt 测量过程的实际运行时间
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- V8垃圾收集器回调,用于测量GC活动
- 测量精确的时间,单位为纳秒C++
- 如何测量cudaMalloc执行时间
- C/C++memcpu基准测试:测量CPU和墙时间
- 如何测量一个音频样本中的低音量
- 鲁棒,快速复杂多边形(带孔)三角测量c/c++库与许可许可