【发布时间】:2021-08-23 13:02:20
【问题描述】:
我有一个点集 P,它表示平面多边形的(有序)边界点,内部没有任何点。多边形可能是凹的,并且至少为weakly simple。可以将所有多边形约束为简单。我的目标是比 O(n^2) 更快地对平面多边形进行三角剖分。
集合 P 的大小从几百点到 1-2 百万不等。由于这些多边形是如何生成的特定原因,很难简单地进行下采样并获得更小的集合 P。
我在 Python 中工作——对于我使用哪些软件包或它们拥有什么许可证,我真的没有任何限制。
我尝试过的方法
我的“稳定”软件是围绕earclipping algorithm 构建的。这对于具有数百或数千个点的小示例非常有效,但对于大型多边形来说运行时间过长。它没有利用边界和边界排序的知识(而且很挑剔,会产生非常丑陋的网格)。
最近我尝试使用Triangle,通过一些python bindings,以及受约束的德劳内算法。即使在提供边界边时,在凹形上运行的约束 Delaunay 也会返回多边形边界腔内的三角形。注意:我不需要(准)Delaunay 三角剖分,我正在查看Triangle,因为它紧凑、广受好评且速度快。
凹面填充的一个简单解决方案是检查生成的 tris 是否在边界内(例如,计算每个 tris 的质心并运行多边形中的点算法)。然而,简单的多边形点算法(如光线投射)在 O(n^2) 时间内运行,因为对于 P 中的 n 个点,有 n 个边界边,必须检查 ~n 个生成的 tris。
问题的具体形式
- 是否有利用我高度具体的案例的算法(不同于耳夹或约束 delaunay),或者
- 有没有更有效的方法来检查生成的 tris 是否在我的边界内?
根据我在下面链接到的其他一些 SO 帖子,听起来Triangle 满足了上述一项或两项要求,而我根本没有充分利用它(可能也是 python 绑定的限制) ?)。我对 C 的功能上不存在知识;到目前为止,挖掘Triangle 代码毫无结果。
我看过的类似的 SO 问题并没有完全解决我的问题:
【问题讨论】:
标签: python triangulation